Provisioning with Puppet

1,043 views

Published on

Published in: Technology
  • Be the first to comment

Provisioning with Puppet

  1. 1. Provisioning with PuppetPhoto: http://www.flickr.com/photos/vasta/4463786284/
  2. 2. $ whoami Joe Ray Senior Systems Developer Future Publishing @jr261
  3. 3. Overview• Why you should use provisioners• What is Puppet?• How do you use it?• Using Puppet with Vagrant• Using Puppet in production
  4. 4. Why use provisioners?• Reproducible setup• Write less documentation• Same config for multiple platforms• Scale your setup • Easily move from development to production • Distribute amongst team • SSH access not necessary• Use associated tools
  5. 5. What is Puppet?• Configuration management tool• Platform-agnostic (supports Linux, Free/OpenBSD, OSX, Windows, Solaris)• Description of systems configuration using manifests• Idempotent
  6. 6. Resources• Building blocks of configuration: • packages • services • files • users / groups
  7. 7. Resourcespackage { nginx: ensure => present,}user { joe: ensure => present, shell => /bin/zsh, home => /home/joe,}
  8. 8. Modules• Self-contained, reusable sets of resources• Typical pattern: • Install package • Manage service • Provide configuration helpers (defined types)• http://forge.puppetlabs.com
  9. 9. Modulesclass nginx($workers=1, $ensure=present) { package { nginx: ensure => $ensure, } service { nginx: ensure => $ensure, subscribe => File["/etc/nginx/nginx.conf"], require => File["/etc/nginx/nginx.conf"], } file { "/etc/nginx/nginx.conf": ensure => $ensure, content => template("nginx/nginx.conf.erb"), require => Package[nginx], }}
  10. 10. Templatesserver {! listen 80;! server_name <%= domain %>;! root <%= root %>;! access_log /var/log/nginx/<%= domain %>.access.log;! keepalive_timeout 5;! location / { index index.html index.htm;! }}
  11. 11. Using modulesinclude nginxclass { nginx: workers => 5,}nginx::site { www.mywebsite.com: config => www.mywebsite.com, root => /data/www.mywebsite.com,}
  12. 12. Using withVagrant::Config.run do |config| config.vm.provision :puppet do |puppet| puppet.manifests_path = "manifests" puppet.manifest_file = "my_manifest.pp" endend
  13. 13. Facts• How Puppet knows about your system$ facterarchitecture => amd64domain => vagrantup.comfacterversion => 1.6.17fqdn => debian6.vagrantup.comhardwareisa => unknownhardwaremodel => x86_64hostname => debian6id => vagrantinterfaces => eth0,loipaddress => 10.0.2.15etc...
  14. 14. Using withVagrant::Config.run do |config| config.vm.provision :puppet, :facts =>{"vagrant" => "vagrant"} do |puppet| puppet.manifests_path = "manifests" puppet.manifest_file = "my_manifest.pp" endend
  15. 15. Using withserver {! listen 80;! server_name <%= domain %>;! root <%= root %>; <% if @vagrant %> satisfy any; deny all; allow 192.168.33.1; allow 10.0.2.2; <% end %>! access_log /var/log/nginx/<%= domain %>.access.log;! keepalive_timeout 5;! location / { index index.html index.htm;! }}
  16. 16. Using Puppet in production manifests / git / svn Puppetmaster modules / files or whatever REST over HTTPS Reports Client Client Client
  17. 17. What next?• Example Puppet project at: github.com/ josno/puppet-example• Read the docs: docs.puppetlabs.com

×