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

Virtualize your stack with Vagrant and Puppet -...

Jacob Mather
February 26, 2014

Virtualize your stack with Vagrant and Puppet - Code PaLOUsa 2014

Want to make it easy to transition your development stack from your laptop to the cloud? Interested in automating your development environment? We will cover everything you need know, and make sure you hit the ground running. We will walk through configuring a single server in a reliable way, and then scaling that out to your own personal cloud.

Find out more information at: http://jmather.com/talks/2014-02-26/virtualize/

Jacob Mather

February 26, 2014
Tweet

More Decks by Jacob Mather

Other Decks in Programming

Transcript

  1. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Who am I? What I do: • Software Engineer at Mashery • Co-organizer of the
 San Francisco PHP User Group • Community Evangelist Where I can be found: • Blog: http://jmather.com • Twitter: @thejmather
  2. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Why I am giving this talk
  3. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Failure to specifically build an environment for development will directly impact developer productivity and product quality.
  4. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 What is Vagrant? A tool that allows you to create and configure lightweight, reproducible, and portable development environments.
  5. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Why was Vagrant created? To enable developers to have easy an to build development environment that is identical across the entire team.
  6. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant terms • Box, or base box, is the ‘initial image’ of a virtual machine. • Host, or your computer, the machine running the VMs • Guest, or vm, referring to an individual VM instance • Provider, an adapter to a VMS (like VirtualBox or VMWare) • Provisioner, provides post-boot configuration of guests
  7. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 How to use Vagrant • Install Vagrant - http://vagrantup.com • Check out your repository • Run: vagrant up
  8. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrant Commands • vagrant up - Turn guest on • vagrant halt - Turn guest off • vagrant status - Show guest status • vagrant destroy - Delete guest • vagrant suspend - Suspend guest • vagrant resume - Resume guest • vagrant ssh - SSH into guest
  9. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
 end

  10. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add file system) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.synced_folder("/data",  "/vagrant_data")
 end

  11. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add port forwarding) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.synced_folder("/data",  "/vagrant_data")
    config.vm.network(:forwarded_port,  guest:  80,  host:  8080)
 end

  12. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add port forwarding) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.synced_folder("/data",  "/vagrant_data")
    config.vm.network(:forwarded_port,  guest:  80,  host:  8080)
 end

  13. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add port forwarding) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.synced_folder("/data",  "/vagrant_data")
    config.vm.network  :forwarded_port,  guest:  80,  host:  8080
 end

  14. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add port forwarding) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.synced_folder("/data",  "/vagrant_data")
    config.vm.network(:forwarded_port,  guest:  80,  host:  8080)
 end

  15. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Replicating production matters If you are writing code that will be deployed to a multiple-host environment, why aren’t you writing your code in a multiple- host environment?
  16. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile Vagrant.configure("2")  do  |config|
    config.vm.hostname  =  "web-­‐server"
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
 end

  17. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile Vagrant.configure("2")  do  |config|   
    config.vm.hostname  =  "web-­‐server"
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
 end

  18. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end

  19. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end

  20. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define(“web-­‐server”,  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end)
 end
 NOT ACTUALLY VALID SYNTAX
  21. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end

  22. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end

  23. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2",  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end)
 NOT ACTUALLY VALID SYNTAX
  24. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest ready) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
 end

  25. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest) Vagrant.configure("2")  do  |config|
    config.vm.define  "web-­‐server"  do  |node|
        node.vm.hostname  =  "web-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"
        node.vm.box_url  =  "http://some/url.box"
    end
    config.vm.define  "db-­‐server"  do  |node|
        node.vm.hostname  =  "db-­‐server"
        node.vm.box  =  "base-­‐box-­‐name"  
        node.vm.box_url  =  "http://some/url.box"
    end
 end
  26. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest, useful, part 1) nodes  =  {
        'web-­‐server'  =>  {
                :hostname  =>  'server.example.com',
                :ipAddress  =>  '192.168.56.60',
        },
        'db-­‐server'  =>  {
                :hostname  =>  'db.example.com',
                :ipAddress  =>  '192.168.56.61',
        }
 }
  27. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest, useful, part 2) nodes  =  {  /*  ...  node  configuration  ...  */  };
 Vagrant.configure("2")  do  |config|
    nodes.each_pair  do  |name,  options|
        machineName  =  options[:hostname]
        ipAddy  =  options[:ipAddress]          config.vm.define  name  do  |node|
            node.vm.box  =  "base-­‐box-­‐name"
            node.vm.box_url  =  "http://some/url.box"
            node.vm.hostname  =  machineName
            node.vm.network(:private_network,  ip:  ipAddy)
        end
    end
 end
  28. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (Multi-Guest, useful, part 2) nodes  =  {  /*  ...  node  configuration  ...  */  };
 Vagrant.configure("2")  do  |config|
    nodes.each_pair  do  |name,  options|
        machineName  =  options[:hostname]
        ipAddy  =  options[:ipAddress]          config.vm.define  name  do  |node|
            node.vm.box  =  "base-­‐box-­‐name"
            node.vm.box_url  =  "http://some/url.box"
            node.vm.hostname  =  machineName
            node.vm.network(:private_network,  ip:  ipAddy)
        end
    end
 end
  29. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Providers ! Providers ! Vagrant
  30. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Providers VirtualBox VMWare (WS or Fusion) Parallels Desktop ! Providers ! Vagrant
  31. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Providers VirtualBox VMWare (WS or Fusion) Parallels Desktop Amazon AWS Digital Ocean ! Providers ! Vagrant
  32. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Providers (desktop) • VirtualBox is FREE! (sort of) • Some people have trouble with crashes • Some people have trouble with suspend/resume • Built in FS bridging is historically bad but getting better • Newer versions are less stable (use 4.2.16!!) • VMWare (Workstation or Fusion!) is PAID! • You have to buy both VMWare and provider • Supposed to be more stable and snappy • Parallels Desktop is FREE! • Open source projects FOR THE WIN!
  33. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Providers (cloud) • Amazon AWS • Digital Ocean • RackSpace Cloud
  34. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Provider Limits Spinning up guests is cool, but what do I do with a box once it’s up? How do I control it? How do I make it useful? ! Computing hardware without software is nearly useless.
  35. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Vagrant Provisioners ! Provisioners ! Vagrant
  36. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Shell Scripts Puppet Chef Ansible Vagrant Provisioners ! Provisioners ! Vagrant
  37. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 What is Puppet? Puppet, an automated administrative engine for your Linux, Unix, and Windows systems, performs administrative tasks (such as adding users, installing packages, and updating server configurations) based on a centralized specification.
  38. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Why was Puppet created? Puppet was created to provide a declarative way to define system and software configuration.
  39. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet terms • Manifests - This is “application” code • Modules - This is “library” code • Templates - Exactly as it sounds • Facter - Environment data • Hiera - Configuration data
  40. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 How to use Puppet? Select a base box for Vagrant from Puppet Labs ! http://puppet-vagrant-boxes.puppetlabs.com/ ! I tend to use CentOS 6.4 for VirtualBox
  41. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
 end

  42. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Vagrantfile (add Puppet) Vagrant.configure("2")  do  |config|
    config.vm.box  =  "base-­‐box-­‐name"
    config.vm.box_url  =  "http://some/url.box"
    config.vm.provision  :puppet  do  |puppet|
        puppet.manifests_path  =  "puppet/manifests/"
        puppet.manifest_file    =  “init.pp"
        puppet.module_path  =  "puppet/modules/"
    end
 end

  43. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Puppet Manifest (init.pp) notify  {  "Look!  My  puppet  code  is  working!":  }

  44. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Puppet Manifest (init.pp, add Apache) notify  {  "Look!  My  puppet  code  is  working!":  }
    
 package  {  "httpd":
    ensure  =>  present,
 }
    
 service  {  "httpd":
    require  =>  Package["httpd"],
    ensure  =>  running,
    enabled  =>  true,
 }
  45. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Basic Puppet Manifest (refactored Apache) #  manifests/init.pp
 notify  {  "Code  works!":  }
 require  server::httpd
 #  modules/server/httpd.pp
 class  server::httpd  {
    package  {  "httpd":
        ensure  =>  present,
    }
    service  {  "httpd":
        require  =>  Package["httpd"],
        ensure  =>  running,
        enabled  =>  true,
    }
 }
  46. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (controlling flow) class  demo  {
    notify  {  "Say  me  third":
        require  =>  Notify["Say  me  second"],
    }
    
    notify  {  "Say  me  second":
        require  =>  Notify["Say  me  first"],
    }
    
    notify  {  "Say  me  first":  }
 }
  47. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (controlling flow) class  demo  {
    notify  {  "Say  me  third":
        require  =>  Notify["Say  me  second"],
    }
    
    notify  {  "Say  me  second":
        require  =>  Notify["Say  me  first"],
    }
    
    notify  {  "Say  me  first":  }
 } Output Say me first Say me second Say me third
  48. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (adding parameters) #  modules/server/writetestfile.pp
 class  server::writetestfile  ($content)  {
    file  {  "/tmp/test":
        content  =>  $content,
    }
 }
 
 #  or,  to  provide  a  default…
 class  server::writetestfile  ($content  =  "")  {
    file  {  "/tmp/test":
        content  =>  $content
    }
 }
  49. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (passing parameters) #  manifests/init.pp  -­‐-­‐  using  defaults
 include  server::writetestfile
 
 #  manifests/init.pp  -­‐-­‐  passing  custom  value
 class  {  "server::writetestfile":
    content  =>  "test  content",
 }
  50. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (including classes) #  the  class  below  must  be  loaded  BEFORE  guest
 require  server::writetestfile
    
 #  the  class  below  must  be  loaded  WITH  guest
 include  server::writetestfile      
 #  the  class  below  must  be  loaded  AFTER  guest
 class  {  "server::writetestfile":
    content  =>  "test  content",
 }
  51. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 External Input in Puppet There are three primary sources of where data that branches your logic will come from: ! • User Space Variables • $things = “you set yourself” • Facts • Specific details about your current environment, such as the name of the host, ip address, operating system, etc... • Hiera • Configuration you pass in to enable building for multiple configurations from the same shared codebase !
  52. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (variables) #  local  variable
 $host  =  "mybox"
 
 if  ($host  ==  "mybox")  {
    notify  {  "Box!":  }
 }
 
 if  ($host  ==  "mybox")  {
    notify  {  "${host}!":  }
 }
  53. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (variables, facts, scope) #  fact  -­‐  environment  configuration
 if  ($::hostname  ==  "box")  {  notify  {  "Box!":  }  }                                                                                  #  outputs:  Box!
 if  ($hostname  ==  "box")  {  notify  {  "Box!":  }  }                                                                                  #  outputs:  Box!
 #  assign  $hostname  locally...
 $hostname  =  "some  string"
 if  ($::hostname  ==  "box")  {  notify  {  "Box!":  }  }                                                                                  #  outputs:  Box!
 if  ($hostname  ==  "box")  {  notify  {  "Box!":  }  }                                                                                  #  no  output

  54. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (facts, debugging) #  what  facts  are  there?  Let’s  find  out!
    
 #  this  should  be  one  line,  but  it  is  too  long  to  fit
 $tmpl  =  "<%=  scope.to_hash.reject  {  |k,v|  !(  k.is_a?
                  (String)  &&  v.is_a?(String)  )  }.to_yaml  %>"
    
 #  create  a  file...
 file  {  "/tmp/facts.yaml":
    content  =>  inline_template($tmlp),
 }
  55. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (facts, debugging, cont…) What values are available? ! architecture, kernelversion, netmask_eth1, rubyversion, operatingsystem, memorysize_mb, processor0, interfaces, uptime, physicalprocessorcount, osfamily, selinux, operatingsystemrelease, ipaddress, and much more…
  56. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (hiera) #  hieradata/common.yml
 thing:  "Something  Special"
 #  modules/server/writetestfile.pp
 class  server::writetestfile  ()  {
    $content  =  hiera('thing')
    file  {  "/tmp/test":
        content  =>  $content
    }
 }
  57. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (hiera, really neat) #  hieradata/common.yml
 server::writetestfile::content:  "Something  Special"
 #  modules/server/writetestfile.pp
 class  server::writetestfile  ($content  =  "")  {
    file  {  "/tmp/test":
        content  =>  $content
    }
 }
  58. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (if conditionals) if  ("a"  ==  "b")  {
    notify  {  "Inconceivable!":  }
 }  elsif  ("hello"  =~  "help")  {
    notify  {  "Regex!":  }
 }  else  {
    notify  {  "Echo  something...":  }
 }
  59. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (case conditionals) #  $::operatingsystem  is  a  fact,  provided  by  Facter
 case  $::operatingsystem  {
    centos,  redhat:  {  $apache  =  "httpd"  }
    debian,  ubuntu:  {  $apache  =  "apache2"  }
    default:  {  fail("Unrecognized  operating  system")  }
 }
 
 case  $::operatingsystem  {
    /linux/:  {  fail("We  don’t  support  Linux!”)  }
 }
  60. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Puppet Manifest (selector conditionals) #  $::operatingsystem  is  a  fact,  provided  by  Facter
 $package  =  $::operatingsystem  ?  {
    centos  =>  "httpd",
    redhat  =>  "httpd",
    /(i?)(ubuntu|debian)/  =>  "apache2",
    default  =>  undef
 }
  61. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Configure our guest nodes (Vagrantfile) nodes  =  {
        'web-­‐server'  =>  {
                :hostname  =>  'server.example.com',
                :ipAddress  =>  '192.168.56.60',
        },
        'db-­‐server'  =>  {
                :hostname  =>  'db.example.com',
                :ipAddress  =>  '192.168.56.61',
        }
 }
  62. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Tell Vagrant about them (Vagrantfile) nodes  =  {  /*  ...  node  configuration  ...  */  };
 Vagrant.configure("2")  do  |config|
    nodes.each_pair  do  |name,  options|
        hostname  =  options[:hostname]
        ipAddy  =  options[:ipAddress]
        config.vm.define  name  do  |node|
            node.vm.box  =  "base-­‐box-­‐name"
            node.vm.box_url  =  "http://some/url.box"
            node.vm.hostname  =  hostname
            node.vm.network(:private_network,  ip:  ipAddy)
        end
    end
 end
  63. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Tell Vagrant about Puppet (Vagrantfile) nodes  =  {  /*  ...  omit  node  configuration  ...  */  }
 Vagrant.configure("2")  do  |config|
    nodes.each_pair  do  |name,options|
        config.vm.define  name  do  |node|
            /*  ...  omit  basic  node  definition  ...  */              node.vm.provision  :puppet  do  |puppet|
                puppet.manifests_path  =  "puppet/manifests/"
                puppet.manifest_file    =  "init.pp"
                puppet.module_path  =  "puppet/modules/"
            end          end
    end
 end
  64. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 nodes  =  {  /*  ...  omit  node  configuration  ...  */  }
 Vagrant.configure("2")  do  |config|
    nodes.each_pair  do  |name,options|
        config.vm.define  name  do  |node|
            /*  ...  omit  basic  node  definition  ...  */              node.vm.provision  :puppet  do  |puppet|
                puppet.manifests_path  =  "puppet/manifests/"
                puppet.manifest_file    =  "init.pp"
                puppet.module_path  =  "puppet/modules/"
            end          end
    end
 end Tell Vagrant about Puppet (Vagrantfile)
  65. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Tell Puppet about the guest nodes #  file:  puppet/manifests/init.pp
 if  ($::hostname  ==  "web-­‐server")  {
    #  only  run  for  web  server
 }
 
 if  ($::hostname  ==  "db-­‐server")  {
    #  only  run  for  db  server
 }
  66. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Tell Puppet about the guest nodes (redux) #  file:  puppet/manifests/init.pp
 if  ($::hostname  =~  /^web-­‐/)  {
    #  only  run  for  web  servers
 }
 
 if  ($::hostname  =~  /^db-­‐/)  {
    #  only  run  for  db  servers
 }
  67. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Shell Scripts Puppet Chef Ansible VirtualBox VMWare (WS or Fusion) Parallels Desktop Amazon AWS Digital Ocean Vagrant Architecture ! Providers ! Provisioners ! Vagrant
  68. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Development environments come in all shapes and sizes • Some develop in production – Yes, really. • Some develop on a non production server – Not a copy of production, not by a long shot • Some develop locally on a “non production server” – Home grown solutions that “work” until they don’t • Some develop on a development server – Actually tries to be like production – Not always like production – May have additional tuning to help with developmenty things • Some develop in a true development environment – Locally or remote, coming soon to a computer near you
  69. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Why developing in production is really bad Assuming, of course, that you are testing your code before you make it live. Production should always move from one stable version of code to another stable version of code. When you edit code in production, you inherently introduce instability, and can no longer be assured that your code is running as tested.
  70. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Why developing on a non production setup is also bad Debugging environmental issues is slow and painful. Developers should be solving problems that are in your software, not debugging configuration issues in your environment. When you build your code in an environment that isn’t related to production in any tangible way, you will often have constant reminders just how different your development environment is from production.
  71. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Where your development environment lives Remote • Easy for operations to set up • Easy to enforce a rigid structure • Limits developer’s choice of tool chain selection • Can get expensive and complicated to maintain • Developers must be online to do any development Local • Can require beefier hardware • Can take extra work to set up • Developers have the freedom to work how they work best • Developers can assist with infrastructural initiatives
  72. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Bad development environments will sap the resources out of your team. In addition to the time spent developing and testing new code and fixing bugs, you will spend time: When development environments attack Debugging broken environments or settings Debugging broken behavior between dev and prod Debugging broken behavior between two dev systems Working in broken ways because “it works”
  73. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 If your development environment does not closely match production, you won’t know if your code really works until you make it live.
  74. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Takeaways • Bad (or unstable) environments (be it dev, qa, staging, or prod) hurt developers. • Puppet lets you automate all of the configuration of your systems (dev, qa, staging, and prod), ensuring consistency between them. • Vagrant is easy to use, and will let you use your production puppet configs to build development environments. • You will manage server configuration, whether you decide to or not. If you choose not to do it formally it will come back to bite you when you forget something later.
  75. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 If you’re still not sold... h"p://PuPHPet.com/ / PuPHPet/provides/a/ simple/config/tool/for/ those/who/don’t/want/ to/=nker/with/puppet/ and/need/a/LAMP/stack/ up/and/running/NOW./
  76. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 And also look at... • Packer • http://packer.io • Take your Vagrant and Puppet usage to the next level by using Packer to pre-provision images for easy first spins • Build prebuilt systems for multiple VMS and cloud platforms • Docker • http://docker.io • A different idea of how to build multiple machine VM environments
  77. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 ! We are hiring at
  78. Virtualize your stack with Vagrant and Puppet - Code PaLOUsa

    - February 26th, 2014 Thank you! More information about this talk can be found at: ! http://bit.ly/cpl14-virtualize ! RATE MY TALK AT: http://spkr8.com/t/29441 ! PLEASE LEAVE FEEDBACK It’s the only way I can improve