Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Puppet Modules Are Our Friends

Paul Hinze
February 06, 2013

Puppet Modules Are Our Friends

Internal presentation given to Instructure Ops team, Feb 2013.

Paul Hinze

February 06, 2013
Tweet

More Decks by Paul Hinze

Other Decks in Technology

Transcript

  1. our mission # TODO: Turn this pattern into a puppet

    module file { "/etc/init/collect-cpu-stats.conf": content => template("etc/init/collect-cpu-stats.conf.erb") } file { "/etc/init.d/collect-cpu-stats": ensure => "/lib/init/upstart-job", } remotefile { "/usr/local/bin/collect-cpu-stats": mode => 755, notify => Service["collect-cpu-stats"], } service { collect-cpu-stats: ensure => running, require => [ File["/usr/local/bin/collect-cpu-stats"], File["/etc/init/collect-cpu-stats.conf"], File["/etc/init.d/collect-cpu-stats"], ] }
  2. a place for everything... $ tree puppet/modules/collect_cpu_stats collect_cpu_stats # module

    root dir ├── files # static files ├── lib │ ├── facter # custom facts │ └── puppet │ ├── parser │ │ └── functions # custom parser functions │ └── type # native puppet types ├── manifests │ └── init.pp # *** entry point *** └── templates # template files
  3. ...and everything in its place $ tree puppet/modules/collect_cpu_stats collect_cpu_stats ├──

    files │ └── collect-cpu-stats ├── manifests │ ├── config.pp │ ├── init.pp │ ├── script.pp │ └── service.pp └── templates └── collect-cpu-stats.conf.erb
  4. the classic init.pp class collect_cpu_stats { include collect_cpu_stats::package include collect_cpu_stats::config

    include collect_cpu_stats::service Class['collect_cpu_stats::package'] -> Class['collect_cpu_stats::config'] -> Class['collect_cpu_stats::service'] -> Class['collect_cpu_stats'] } manifests/init.pp
  5. adding parameters class collect_cpu_stats ( $hostname = $fqdn $interval =

    10 ) { include collect_cpu_stats::package class { 'collect_cpu_stats::config' hostname => $hostname, interval => $interval } include collect_cpu_stats::service Class['collect_cpu_stats::package'] -> Class['collect_cpu_stats::config'] -> Class['collect_cpu_stats::service'] -> Class['collect_cpu_stats'] } manifests/init.pp
  6. customize names for clarity class collect_cpu_stats ( $hostname = $fqdn

    $interval = 10 ) { include collect_cpu_stats::script class { 'collect_cpu_stats::config' hostname => $hostname, interval => $interval } include collect_cpu_stats::service Class['collect_cpu_stats::script'] -> Class['collect_cpu_stats::config'] -> Class['collect_cpu_stats::service'] -> Class['collect_cpu_stats'] } manifests/init.pp
  7. script.pp: sourcing files class collect_cpu_stats::script { file { '/usr/local/bin/collect-cpu-stats': mode

    => 755, source => 'puppet:///modules/collect_cpu_stats/collect-cpu-stats' } file { '/etc/init.d/collect-cpu-stats': ensure => link, target => '/lib/init/upstart-job' } } manifests/script.pp
  8. config.pp: using templates class collect_cpu_stats::config ( $hostname, $interval ) {

    file { '/etc/init/collect-cpu-stats.conf': content => template('collect_cpu_stats/collect-cpu-stats.conf.erb'), notify => Class['collect_cpu_stats::service'] } } manifests/config.pp
  9. service.pp: simple as it gets class collect_cpu_stats::service { service {

    'collect-cpu-stats': ensure => running, } } manifests/service.pp
  10. ta da! $ tree puppet/modules/collect_cpu_stats collect_cpu_stats ├── files │ └──

    collect-cpu-stats ├── manifests │ ├── config.pp │ ├── init.pp │ ├── script.pp │ └── service.pp └── templates └── collect-cpu-stats.conf.erb
  11. it’s just unix philosophy Rule of Modularity Rule of Clarity

    Rule of Composition Rule of Separation ... etc.
  12. unix philosophy in puppet “do one thing well” require/notify classes,

    not types design for composability pull configuration up to init.pp intentional interface design
  13. use the puppet style guide one class/define per file one

    parameter per line quoting, spacing, etc. when in doubt, check it!
  14. types of puppet modules “base-blocks”: generic to the world “weird-blocks”:

    specific to us “site-services”: assemble blocks “site-roles”: assemble services
  15. app_server build it up instructure::monitoring collectd collect_cpu_stats ... instructure::logging rsyslog

    rsyslog_forward ... canvas::rails passenger canvas::deps ... apache2
  16. app_server build it up instructure::monitoring collectd collect_cpu_stats ... instructure::logging rsyslog

    rsyslog_forward ... canvas::rails passenger canvas::deps ... apache2 db_server instructure::monitoring collectd collect_cpu_stats ... instructure::logging rsyslog rsyslog_forward ... canvas::database pgfouine canvas::pgdbs ... postgres