Upload
puppet-labs
View
3.653
Download
0
Tags:
Embed Size (px)
DESCRIPTION
"Building Data-Driven Infrastructure with Puppet" by James Fryman, Operations Hacker, GitHub, Inc. Presentation Overview: As your Puppet Infrastructure grows, so does the complexity of the Puppet codebase. The complexity of the codebase often creates a scenario where it becomes more time consuming to modify/add to the codebase. Likewise, any new addition or node still may require modifications to the Puppet database, which could include the management of many edge cases. Fortunately, the software industry has been working on developing techniques with code abstraction, refactoring, and software maturity. This talk will focus on how to write scalable modules within Puppet to be used to create Data Driven Infrastructures. In addition, this talk will demonstrate how to structure process/procedure/code to quickly and rapidly scale operations with minimal modifications to Puppet code. Speaker Bio: James Fryman, Operations Hacker, GitHub, Inc. James Fryman is a Technologist who has been working on spreading the good word of technology via the greatest mechanism known to man: the beer fueled rant. James has been working to automate software and infrastructure for the last 10 years, and has learned quite a bit about Security, Architecture, Scaling, and Development as a result. James currently works for GitHub as an Operations Hacker.
Citation preview
Friday, August 23, 13
DataDrivenInfrastructure
Friday, August 23, 13
Friday, August 23, 13
?
Friday, August 23, 13
Let meTell youa story
Friday, August 23, 13
What is a
Cloud
Friday, August 23, 13
I don’t have to think about IT
With the Cloud...
Friday, August 23, 13
Friday, August 23, 13
aaSPlatformSoftware
Infrastructure
Friday, August 23, 13
Friday, August 23, 13
Friday, August 23, 13
Where is our cloud?
Friday, August 23, 13
Friday, August 23, 13
UtopiaFriday, August 23, 13
James Fryman
Friday, August 23, 13
Friday, August 23, 13
Automations Junkie
Friday, August 23, 13
Are youCrazy?
Friday, August 23, 13
Goals?Data?What
Friday, August 23, 13
Goals?Data?What
Friday, August 23, 13
Goals?Data?What
Friday, August 23, 13
Machine
Parsable
Friday, August 23, 13
There is SystemOne
Friday, August 23, 13
Feedback
PuppetDBProvisioning
Configuring
Destroying
gPanel
Friday, August 23, 13
Partsof the
SystemFriday, August 23, 13
provisioner
Friday, August 23, 13
Home GrownFriday, August 23, 13
Home Grown
Friday, August 23, 13
controller
Friday, August 23, 13
Lots O’ Models
Friday, August 23, 13
file { '/etc/facter/facts.d/quagga_manage_service': ensure => present, replace => false,} if $::quagga_manage_service { $service_state[ensure] = running $service_state[enable] = true} else { $service_state[ensure] = undef $service_state[enable] = undef} service { 'quagga': ensure => $service_state[ensure], enable => $service_state[enable],}
Friday, August 23, 13
orchestrator
Friday, August 23, 13
ChatOps
Friday, August 23, 13
ChatOps
Friday, August 23, 13
Feedbackof the
SystemFriday, August 23, 13
Metrics&MonitoringFriday, August 23, 13
begin JSON.parse(RestClient.get(url)).each do |cache| data["#{cache['target']}"] = 0 count = 0 cache["datapoints"].each do |point| unless (point[0].nil?) data["#{cache['target']}"] += point[0] count += 1 end end data["#{cache['target']}"] /= count data["total"] += data["#{cache['target']}"] endrescue ZeroDivisionError => e puts "UNKNOWN metric not in graphite!" exit EXIT_UNKNOWNrescue => e puts e.message exit EXIT_CRITICALend
Friday, August 23, 13
begin JSON.parse(RestClient.get(url)).each do |cache| data["#{cache['target']}"] = 0 count = 0 cache["datapoints"].each do |point| unless (point[0].nil?) data["#{cache['target']}"] += point[0] count += 1 end end data["#{cache['target']}"] /= count data["total"] += data["#{cache['target']}"] endrescue ZeroDivisionError => e puts "UNKNOWN metric not in graphite!" exit EXIT_UNKNOWNrescue => e puts e.message exit EXIT_CRITICALend
Friday, August 23, 13
event
Friday, August 23, 13
eventlog
Friday, August 23, 13
eventalertlog
Friday, August 23, 13
eventalertlog error
Friday, August 23, 13
Must self-correct
Friday, August 23, 13
Feedback
PuppetDBProvisioning
Configuring
Destroying
gPanel
Friday, August 23, 13
Friday, August 23, 13
Deployable using text files
Friday, August 23, 13
Modularity
Friday, August 23, 13
haproxy::proxy { $es_proxy_name: proxy => 'listen', mode => 'http', ip => $::ipaddress_lo, port => '9200', config => { balance => 'roundrobin', }, }
Friday, August 23, 13
haproxy::proxy { $es_proxy_name: proxy => 'listen', mode => 'http', ip => $::ipaddress_lo, port => '9200', config => { balance => 'roundrobin', }, }
Friday, August 23, 13
haproxy::proxy::member { $es_proxy_name: hostname => $::ec2_local_ipv4, port => '9200', param => [ 'weight 1', 'maxconn 1000', 'check', ], }
Friday, August 23, 13
collectd::plugin { [ 'cpu', 'load', 'memory', 'swap', 'irq', 'exec', 'entropy', ]: }
collectd::plugin { [ 'df', 'interface', 'protocols', 'disk', ]: config => true }
Friday, August 23, 13
Level 4:Templates
Level 5:Data Driven
Friday, August 23, 13
SelfAuthoritati
ve
Friday, August 23, 13
def self.collect_resources(resource) query = [ "and", ["=", "type", "File"], ["=", "exported", true], ["=", "tag", "nagios::object::#{resource}"], ["=", ["node", "active"], true] ] self.search('/v2/resources', query.to_json) end
Friday, August 23, 13
def self.collect_resources(resource) query = [ "and", ["=", "type", "File"], ["=", "exported", true], ["=", "tag", "nagios::object::#{resource}"], ["=", ["node", "active"], true] ] self.search('/v2/resources', query.to_json) end
Friday, August 23, 13
# Seed the initial file with false, and enable # on next run with gh-nagios enable_pager <hostname>
file { '/etc/facter/facts.d/enable_pager.txt': ensure => file, owner => 'root', group => 'root', mode => '0644', content => 'enable_pager=false', replace => false,}
Friday, August 23, 13
@@file { "/etc/nagios/objects/${type}.d/${filename}.cfg": content => template('nagios/etc/nagios/object.erb'), mode => '0444', group => 'nagios', notify => Service['nagios'], }
Friday, August 23, 13
Tips
Friday, August 23, 13
Refactoring
Friday, August 23, 13
Refactoring
Friday, August 23, 13
least to mostspecific
Friday, August 23, 13
frymanet.com
mysqlnginx rails
rubycommon admin
package repos
Friday, August 23, 13
graduate to params
Friday, August 23, 13
class ntp::params { $defaults = { package => { version => ‘latest’, }, config => { servers => [‘pool.ntp.org’], }, }}
Friday, August 23, 13
externalize
Friday, August 23, 13
class ntp::params { $defaults = { package => { version => hiera(‘ntp_package_version’), }, config => { servers => hiera(‘ntp_servers’), }, }}
Friday, August 23, 13
CloudFormation
Friday, August 23, 13
CloudFormation
Friday, August 23, 13
"Resources": { "RendererServerGroup": { "Type": "AWS::AutoScaling::AutoScalingGroup", "Properties": { "AvailabilityZones": { "Fn::GetAZs": "" }, "LaunchConfigurationName": { "Ref": "LaunchConfig" }, "MinSize": "2", "MaxSize": "16", "Tags": [ { "Key": "Environment", "Value": "Production", "PropagateAtLaunch": "true" }, { "Key": "Role", "Value": "renderer", "PropagateAtLaunch": "true" } ] } },Friday, August 23, 13
Autoloading
Friday, August 23, 13
# autoloader.ppclass nagios::autoload_helpers { $helpers = get_nagios_helpers()
case $::puppetversion { /^3/: { include $helpers } default: { nagios::autoload_helpers::import_shim { $helpers: } } }}
Friday, August 23, 13
# autoloader.ppclass nagios::autoload_helpers { $helpers = get_nagios_helpers()
case $::puppetversion { /^3/: { include $helpers } default: { nagios::autoload_helpers::import_shim { $helpers: } } }}
Friday, August 23, 13
module Puppet::Parser::Functions newfunction(:get_nagios_helpers, :type => :rvalue, :doc => "Grab all modules that have nagios helpers for import") do
module_path = File.expand_path('..', Puppet::Module.find('nagios',compiler.environment.to_s).path)
helpers = Dir["#{module_path}/**/nagios/helpers.pp"].map do |d| "#{d.split('/')[-4]}::nagios::helpers" done
helpers endend
Friday, August 23, 13
Modeling
Friday, August 23, 13
Be Dynamic Friday, August 23, 13
Be Dynamic Friday, August 23, 13
<%- if @comment -%>### <%= @comment %><%- end -%><%= @type %> <% if @label %><%= @label %><% end %> {<%- @config.sort.reverse.each do |key,value| -%> <%- if value.class == Array -%> <%- value.each do |element| -%> <%= key %>(<%= element %>); <%- end -%> <%- else -%> <%= key %>(<%= value %>); <%- end -%><%- end -%>};
Friday, August 23, 13
Fencing Resources
Friday, August 23, 13
# Seed the initial file with false, and enable # on next run with gh-nagios enable_pager <hostname>
file { '/etc/facter/facts.d/enable_pager.txt': ensure => file, owner => 'root', group => 'root', mode => '0644', content => 'enable_pager=false', replace => false,}
Friday, August 23, 13
if $::enable_pager { @@file { "/etc/nagios/objects/${type}.d/${filename}.cfg": content => template('nagios/etc/nagios/object.erb'), mode => '0444', group => 'nagios', notify => Service['nagios'], }}
Friday, August 23, 13
Buy it?
Friday, August 23, 13
Buy it?
Friday, August 23, 13
It’s About
Friday, August 23, 13
Missing?What’s
Friday, August 23, 13
LanguageFriday, August 23, 13
Predictive Analysis
Friday, August 23, 13
Coming
Home
Friday, August 23, 13
Goals?Data?What
Friday, August 23, 13
SystemsThinking
Recap
Friday, August 23, 13
There is SystemOne
Machine
Parsable
Must be a
Known
Quantity
SelfAuthoritati
veMust self-correct
Friday, August 23, 13
Friday, August 23, 13
what’s next?
Friday, August 23, 13
what’s next?
Friday, August 23, 13