puppet: eclipsecon alm 2013

74
Puppet Less talk, more rock ALM Connect 2013

Upload: grimradical

Post on 11-May-2015

962 views

Category:

Technology


0 download

DESCRIPTION

Introductory talk on Puppet I gave at Eclipsecon ALM 2013

TRANSCRIPT

Page 1: Puppet: Eclipsecon ALM 2013

PuppetLess talk, more rock

ALM Connect 2013

Page 2: Puppet: Eclipsecon ALM 2013

[email protected]@grim_radical [github twitter freenode]

Page 3: Puppet: Eclipsecon ALM 2013

Let’s talk about...

Page 4: Puppet: Eclipsecon ALM 2013
Page 5: Puppet: Eclipsecon ALM 2013

Immutabilityis great!

Page 6: Puppet: Eclipsecon ALM 2013
Page 7: Puppet: Eclipsecon ALM 2013

-- Joshua Bloch, “Effective Java”Classes should be immutable unless there's a very good reason to make them mutable....If a class cannot be made immutable, limit its mutability as much as possible.

Page 8: Puppet: Eclipsecon ALM 2013

Immutability allows for invariants, which help you reason about correctness

Page 9: Puppet: Eclipsecon ALM 2013

Immutability prevents spooky action at a distance

Page 10: Puppet: Eclipsecon ALM 2013

Immutability fosters modular, composable abstractions

Page 11: Puppet: Eclipsecon ALM 2013

(this shouldn’t be a tough sell to

developers)

Page 12: Puppet: Eclipsecon ALM 2013

That’s great for develoment, but how

about operations?

Page 13: Puppet: Eclipsecon ALM 2013

Immutability for infrastructure?Because operations is in the same boat as development

Page 14: Puppet: Eclipsecon ALM 2013

Everyone who’s got their app running on a fleet of servers has experienced spooky action at a distance

Page 15: Puppet: Eclipsecon ALM 2013

Known, good state is critical for reliable upgrades

Page 16: Puppet: Eclipsecon ALM 2013

A lack of predictability in your systemsruins automation and abstraction

Page 17: Puppet: Eclipsecon ALM 2013
Page 18: Puppet: Eclipsecon ALM 2013

The problem is that:

Systems are inherently mutable!

But ideally:

Systems should behave as though they weren’t!

Page 19: Puppet: Eclipsecon ALM 2013

façade of immutability. Immutability

Page 20: Puppet: Eclipsecon ALM 2013

façade of immutability. Immutability

-- The Joy of Clojure

façade of immutability. Immutability requires that we layer over and abstract the parts of our system that provide unrestrained mutability.

Computer systems are in many ways open systems, providing the keys to the vault if one is so inclined to grab them. But in order to foster an air of immutability in our own systems, it's of utmost importance to create a

Page 21: Puppet: Eclipsecon ALM 2013
Page 22: Puppet: Eclipsecon ALM 2013

Describe how you’d like your systems to look, and Puppet does all the hard work for you!

Page 23: Puppet: Eclipsecon ALM 2013

Example: Inquirea simple service for exposing system metrics

Page 24: Puppet: Eclipsecon ALM 2013

Example: Inquirehttp://box/inquire/disk_usage

Page 25: Puppet: Eclipsecon ALM 2013

install apachecreate apache user

create apache config filecgi script for “df -h”

correct perms for scriptstart apache

restart if config changes!

Page 26: Puppet: Eclipsecon ALM 2013

Once you’ve got a spec for your service, you can see if a given machine is up to code

Page 27: Puppet: Eclipsecon ALM 2013

• Packages:

• apache

• Users:

• apache

• Config files:

• apache’s httpd.conf

• Services:

• apache should be running

• restart if config file changes

• Data files:

• /var/www/cgi-bin/disk_usage

• executable, owned by apache

• does “df -h”

Page 28: Puppet: Eclipsecon ALM 2013

class inquire_server { package { apache: ensure => installed } user { apache: uid => 1000, shell => "/bin/false" } service { apache: ensure => running }  file { "/etc/httpd/httpd.conf": owner => root, mode => 644, source => "puppet://master-server/httpd.conf", notify => Service[apache];  "/var/www/cgi-bin/disk_usage.sh": owner => apache, mode => 755, content => "/usr/bin/df -h"; }}

Page 29: Puppet: Eclipsecon ALM 2013

class inquire_bootstrap { package { apache: ensure => installed } user { apache: uid => 1000, shell => "/bin/false" } service { apache: ensure => running }  file { "/etc/httpd/httpd.conf": owner => root, mode => 644, source => "puppet://master-server/httpd.conf", notify => Service[apache]; }} class inquire_disk_usage { include inquire_bootstrap file { "/var/www/cgi-bin/disk_usage.sh": owner => apache, mode => 755, content => "/usr/bin/df -h"; }}

Page 30: Puppet: Eclipsecon ALM 2013

class inquire_bootstrap { package { apache: ensure => installed } user { apache: uid => 1000, shell => "/bin/false" } service { apache: ensure => running }  file { "/etc/httpd/httpd.conf": owner => root, mode => 644, source => "puppet://master-server/httpd.conf", notify => Service[apache]; }} define inquiry($command) { include inquire_bootstrap file { "/var/www/cgi-bin/$name.sh": owner => apache, mode => 755, content => $command; }}

Page 31: Puppet: Eclipsecon ALM 2013

node “appserver.mydomain.com” { inquiry { "disk-usage": command => "df -h"; "processes": command => "ps aux"; "kernel-info": command => "uname -a"; }}

Page 32: Puppet: Eclipsecon ALM 2013

node “appserver1.mydomain.com” { inquiry { "disk-usage": command => "df -h"; "processes": command => "ps aux"; "kernel-info": command => "uname -a"; }}

node “appserver2.mydomain.com” { inquiry { "disk-usage": command => "df -h"; "processes": command => "ps aux"; "kernel-info": command => "uname -a"; }}

Page 33: Puppet: Eclipsecon ALM 2013

class instrumentation { inquiry { "disk-usage": command => "df -h"; "processes": command => "ps aux"; "kernel-info": command => "uname -a"; }}

node “appserver1.mydomain.com” { include instrumentation}

node “appserver2.mydomain.com” { include instrumentation}

Page 34: Puppet: Eclipsecon ALM 2013

Rich set of primitives, and make your own. Can use existing modules and abstractions, and make your own.

Page 35: Puppet: Eclipsecon ALM 2013
Page 36: Puppet: Eclipsecon ALM 2013
Page 37: Puppet: Eclipsecon ALM 2013
Page 38: Puppet: Eclipsecon ALM 2013
Page 39: Puppet: Eclipsecon ALM 2013

netmask_lo: 255.0.0.0 augeasversion: 0.10.0 fqdn: pe-debian6.localdomain manufacturer: "VMware, Inc." processorcount: "1" productname: VMware Virtual Platform physicalprocessorcount: 1 facterversion: 1.6.7 boardproductname: 440BX Desktop Reference Platform kernelmajversion: "2.6" hardwareisa: unknown timezone: PDT puppetversion: 2.7.12 (Puppet Enterprise 2.5.1) lsbdistcodename: squeeze is_virtual: "true" operatingsystemrelease: 6.0.2 virtual: vmware type: Other domain: localdomain hostname: pe-debian6 selinux: "false" kernel: Linux kernelrelease: 2.6.32-5-686

ipaddress: 172.16.245.128 processor0: Intel(R) Core(TM) i7-2635QM CPU @ 2.00GHz lsbdistrelease: 6.0.2 uniqueid: 007f0101 hardwaremodel: i686 kernelversion: 2.6.32 operatingsystem: Debian architecture: i386 lsbdistdescription: Debian GNU/Linux 6.0.2 (squeeze) lsbmajdistrelease: "6" interfaces: "eth0,lo" ipaddress_lo: 127.0.0.1 uptime_days: 0 lsbdistid: Debian rubysitedir: /opt/puppet/lib/site_ruby/1.8 rubyversion: 1.8.7 osfamily: Debian memorytotal: &id001 502.57 MB memorysize: *id001 boardmanufacturer: Intel Corporation path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/

Page 40: Puppet: Eclipsecon ALM 2013
Page 41: Puppet: Eclipsecon ALM 2013
Page 42: Puppet: Eclipsecon ALM 2013

file { “/etc/issue”: content => “Got an issue? Here’s a tissue!”,}

file { “/etc/motd”: content => template(“Welcome to $hostname!”),}

Page 43: Puppet: Eclipsecon ALM 2013

file { "/etc/sudoers": owner => root, group => root, mode => 440, source => "puppet:///modules/sudo/sudoers"}

Page 44: Puppet: Eclipsecon ALM 2013

class ntp { package { 'ntp': ensure => installed, } service { 'ntpd': ensure => running, enable => true, subscribe => File['/etc/ntp.conf'], } file { '/etc/ntp.conf': ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", } }

Page 45: Puppet: Eclipsecon ALM 2013

node “webserver.mydomain.com” { include ntp } node “appserver.mydomain.com” { include ntp }

node “database.mydomain.com” { include ntp }

Page 46: Puppet: Eclipsecon ALM 2013

class ssh {

@@sshkey { $hostname: type => dsa, key => $sshdsakey } Sshkey <<| |>>

}

Page 47: Puppet: Eclipsecon ALM 2013
Page 48: Puppet: Eclipsecon ALM 2013
Page 49: Puppet: Eclipsecon ALM 2013

Dir “/tmp/foo”

File “/tmp/foo/bar”

Dir “/tmp”

User “deepak”

Page 50: Puppet: Eclipsecon ALM 2013

Dir “/tmp/foo”

File “/tmp/foo/bar”

Dir “/tmp” User “deepak”

Page 51: Puppet: Eclipsecon ALM 2013

Dir “/tmp/foo”

File “/tmp/foo/bar”

Dir “/tmp” User “deepak”

Page 52: Puppet: Eclipsecon ALM 2013
Page 53: Puppet: Eclipsecon ALM 2013
Page 54: Puppet: Eclipsecon ALM 2013
Page 55: Puppet: Eclipsecon ALM 2013
Page 56: Puppet: Eclipsecon ALM 2013

package { 'ntp': ensure => installed, } service { 'ntpd': ensure => running, enable => true, subscribe => File['/etc/ntp.conf'], } file { '/etc/ntp.conf': ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", }

Page 57: Puppet: Eclipsecon ALM 2013

package { 'ntp': ensure => installed, } service { 'ntpd': ensure => running, enable => true, subscribe => File['/etc/ntp.conf'], } file { '/etc/ntp.conf': ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", }

Page 58: Puppet: Eclipsecon ALM 2013

package { 'ntp': ensure => installed, } service { 'ntpd': ensure => running, enable => true, subscribe => File['/etc/ntp.conf'], } file { '/etc/ntp.conf': ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", }

Page 59: Puppet: Eclipsecon ALM 2013

package { 'ntp': ensure => installed, } service { 'ntpd': ensure => running, enable => true, subscribe => File['/etc/ntp.conf'], } file { '/etc/ntp.conf': ensure => file, require => Package['ntp'], source => "puppet:///modules/ntp/ntp.conf", }

Page 60: Puppet: Eclipsecon ALM 2013
Page 61: Puppet: Eclipsecon ALM 2013
Page 62: Puppet: Eclipsecon ALM 2013
Page 63: Puppet: Eclipsecon ALM 2013

Idempotent, and only does what’s necessary

Page 64: Puppet: Eclipsecon ALM 2013

Compensates for the inherent mutability of systems

Page 65: Puppet: Eclipsecon ALM 2013

Combats spooky action at a distance with automatic repair

Page 66: Puppet: Eclipsecon ALM 2013

Brings predictability to your systems

Page 67: Puppet: Eclipsecon ALM 2013

A foundation of predictability and reliability lets you perform higher-level operations on your infrastructure

Page 68: Puppet: Eclipsecon ALM 2013

Code all the way down

Page 69: Puppet: Eclipsecon ALM 2013

Software-defined infrastructure is...just software. Infrastructure as code is...just code.

Page 70: Puppet: Eclipsecon ALM 2013

Thus, you can treat it like the other code in your application

Page 71: Puppet: Eclipsecon ALM 2013

Scary, but liberating!

Page 72: Puppet: Eclipsecon ALM 2013

Maintaining the state of your systems is the foundation upon which everything rests

Page 73: Puppet: Eclipsecon ALM 2013

Start small, and start somewhere. :)

Page 74: Puppet: Eclipsecon ALM 2013

[email protected]@grim_radical [github twitter freenode]

We’re hiring!