Data Driven Infrastructure

Post on 10-May-2015

756 views 2 download

Tags:

description

"Data Driven Infrastructure" by James Fryman of GitHub at Puppet Camp London 2013. Find the video here: http://puppetlabs.com/community/puppet-camp

Transcript of Data Driven Infrastructure

Friday, August 23, 13

DataDrivenInfrastructure

Friday, August 23, 13

Friday, August 23, 13

?

Friday, August 23, 13

?

http://git.io/UmUdKAFriday, 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

InfrastructureFriday, 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

System

Friday, 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

System

Friday, August 23, 13

Metrics&Monitoring

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

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

SelfAuthoritative

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 most

specificFriday, August 23, 13

frymanet.com

mysqlnginx rails

rubycommon admin

package repos

Friday, August 23, 13

graduate to

paramsFriday, 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

Language

Friday, 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

ParsableMust be aKnownQuantity

SelfAuthoritative

Must self-correctFriday, August 23, 13

Friday, August 23, 13

jfryman

fryman@github.com

Friday, August 23, 13

jfryman

fryman@github.com

Friday, August 23, 13

what’s next?

Friday, August 23, 13

what’s next?

Friday, August 23, 13