Create your very own Development
Environment with Vagrant and Packer
… and a little bit of Puppet
Frank Stelzer https://ww...
Créateur de
Agenda
• Motivation
• Vagrant Introduction
• Base Boxes
• Creating an own Base Box with Packer
• Demo
• Fat vs...
Créateur de
Vagrant
Puppet
Packer
Agenda
Sorry, nothing about Docker in this talk!
Créateur de
Who's speaking?
Frank Stelzer
Software Architect at
SensioLabs Deutschland GmbH
@frastel
Créateur de
Motivation
http://www.flickr.com/photos/mrmoaks/8199740598/
Créateur de
Development Environments
Créateur de
I don't know my dev env, it's just working!
Créateur de
Development Environments
Shared Development Server
XAMPP/MAMP
Vagrant
Golden Image
some undefined VM/local syst...
Créateur de
Criteria for good development
environments
• Isolated
Créateur de
Development Environments
Shared Development Server
XAMPP/MAMP
Vagrant
Golden Image
some undefined VM/local syst...
Créateur de
Criteria for good development
environments
• Isolated
• Same tools for production
Créateur de
Development Environments
XAMPP/MAMP
Vagrant
Golden Image
some undefined VM/local system
Vagrant with Provisioni...
Créateur de
Criteria for good development
environments
• Isolated
• Same tools for production
• Reproducible
Créateur de
Development Environments
Vagrant
Golden Image
some undefined VM/local system
Vagrant with Provisioning
Créateur de
Criteria for good development
environments
• Isolated
• Same tools for production
• Reproducible
• EASY!
Créateur de
Development Environments
Golden Image
Vagrant with Provisioning
Créateur de
VAGRANT
http://www.hashicorp.com/ http://www.vagrantup.com/
Créateur de
Vagrant
VirtualBox
VM

!
dev.smoov.io
Vagrant
Vagrantfile



"name =
dev.smoov.io"
project $ vagrant up
Base Bo...
Créateur de
!
Vagrantfile
Vagrant.configure("2") do |config|
!
config.vm.box = "precise64"
config.vm.network "private_netwo...
Créateur de
vagrant destroy is your friend!
Créateur de
Available Base Boxes
• Ubuntu Lucid 32 Bit (10.04)
• Ubuntu Lucid 64 Bit (10.04)
• Ubuntu Precise 32 Bit (12.0...
Créateur de
Native supported base boxes are not up-
to-date in the most cases
PHP 5.3
nginx 0.9
Apache 1
not node compatib...
Créateur de
Can I haz the new things please?
PHP 5.5.9
nginx 1.6
Apache 2
node!
http://www.flickr.com/photos/chaosandcreati...
Créateur de
Can I? Pleeeease!
Créateur de
Sure!
Créateur de
Wait until new base boxes
will be supported!
http://www.flickr.com/photos/bogenfreund/556656621/
Créateur de
Not really!
Créateur de
Just build your own base box
if you need to!
Créateur de
… and that's now!
Créateur de
Packer!
http://www.hashicorp.com/ http://www.packer.io/
Créateur de
Follow @mitchellh for updates!
Créateur de
!
Base Box defined with simple JSON configuration
        "builders":  [  
                {  
                 ...
Créateur de
Provisioning - with plain shell scripts
"provisioners":  [  
        {  […]    
                "script":  "sc...
Créateur de
Provisioning - with Puppet
"provisioners":  [  
        {  […]    
                "type":  "puppet-­‐masterle...
Créateur de
Resulting VM could be converted to a
Vagrant box or whatever
"builders":  […],  
"post-­‐processors":  [  
   ...
Créateur de
… and it comes with cool magic!
Créateur de
"builders": [
{
"boot_command": [
"<esc><esc><enter><wait>",
"/install/vmlinuz noapic preseed/url=http://
{{ ....
Créateur de
Demo: 

Generating a Base Box for
Vagrant with Packer in 3min
Créateur de
http://youtu.be/wgt9jUyuXVI
Créateur de
Base Box is generated! What's next?
Créateur de
Integrate it to your Vagrant setup!
vagrant  box  add  packer_ubuntu-­‐14.04_virtualbox  file://…
Créateur de
!
Vagrantfile
Vagrant.configure("2") do |config|
!
config.vm.box =
config.vm.network "private_network", ip: "19...
Créateur de
Packer + Vagrant
VirtualBox
VM

!
dev.smoov.io
Vagrant
Base BoxVagrantfile



"name =
dev.smoov.io"
project $
P...
Créateur de
What to put in Base Boxes?
Créateur de
Everything?
Créateur de
Fat Base Box
Fat Base Box



included:

PHP 5

MySQL

Redis

nginx
Créateur de
Fat Base Box
• advantages:
• vagrant up -> ultrafast
• no internet connection needed during VM creation
• disa...
Créateur de
Fat vs. Slim Base Box
Fat Base Box



ISO

VBoxGuestAdditions



PHP 5

MySQL

Redis

nginx
Slim Base Box



I...
Créateur de
Choose wisely according to your needs!
Créateur de
… but …
Créateur de
Slim Base Boxes should be preferred
when infrastructure changes often!
Créateur de
Usage
Fat Base Box

!
• no changes
• System is well known
• Golden Image way
• Admins are defining the system
S...
Créateur de
Slim Base Boxes need additional
provisioning after Virtual Machine has
been installed!
Créateur de
Provisioning with Puppet
VM
Box

!
dev.smoov.io
Vagrant
Base BoxVagrantfile



"name =
dev.smoov.io"
project $
...
Créateur de
Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION)  do  |config|  
    config.vm.box  =  "packer_ubuntu-­‐1...
Créateur de
Why Puppet?
Créateur de
Why Not?
Créateur de
Go for Chef or Ansible if you
want!
Créateur de
Puppet <3
Créateur de
Puppet (2) - DSL Overview
Variables
Conditionals
Facts
Modules
Classes
Templates
Defined Types
Créateur de
Puppet – DSL - Modules
puppet/
|-- manifests
| `-- lamp.pp
`-- modules
|-- apache2
| |-- files
| | `-- staticf...
Créateur de
Puppet DSL - Class
Definition:  
class  composer(  
    $dir    =  '/usr/local/bin'  
)  {  
    exec  {  'com...
Créateur de
Puppet DSL - Defined Type
Definition:  
define  apache2::vhost(  
        $server_name      =  $name,  
       ...
Créateur de
Puppet DSL - Manifest
#  manifests/dev.pp  
    #  ...  
    class  {  'apache2':  }  
    -­‐>  
    apache2:...
Créateur de
Infrastructure as Code
Créateur de
To sum up
• with Vagrant you can create Virtual Machines bases on
Base Boxes very easy
• Packer adds the possi...
Créateur de
Need more Information or Help!?
http://sensiolabs.de/workshops/vagrant/
packer build <your own base box>.json ...
Upcoming SlideShare
Loading in …5
×

Create your very own Development Environment with Vagrant and Packer

2,128
-1

Published on

Presentation about Vagrant and Packer held on PHP Usergroup Duesseldorf http://www.meetup.com/PHP-Usergroup-Duesseldorf/events/176868772/

Published in: Technology
2 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total Views
2,128
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
36
Comments
2
Likes
5
Embeds 0
No embeds

No notes for slide

Create your very own Development Environment with Vagrant and Packer

  1. 1. Create your very own Development Environment with Vagrant and Packer … and a little bit of Puppet Frank Stelzer https://www.flickr.com/photos/eiriknewth/238681391
  2. 2. Créateur de Agenda • Motivation • Vagrant Introduction • Base Boxes • Creating an own Base Box with Packer • Demo • Fat vs. Thin Boxes • Provisioning with Puppet
  3. 3. Créateur de Vagrant Puppet Packer Agenda Sorry, nothing about Docker in this talk!
  4. 4. Créateur de Who's speaking? Frank Stelzer Software Architect at SensioLabs Deutschland GmbH @frastel
  5. 5. Créateur de Motivation http://www.flickr.com/photos/mrmoaks/8199740598/
  6. 6. Créateur de Development Environments
  7. 7. Créateur de I don't know my dev env, it's just working!
  8. 8. Créateur de Development Environments Shared Development Server XAMPP/MAMP Vagrant Golden Image some undefined VM/local system Vagrant with Provisioning
  9. 9. Créateur de Criteria for good development environments • Isolated
  10. 10. Créateur de Development Environments Shared Development Server XAMPP/MAMP Vagrant Golden Image some undefined VM/local system Vagrant with Provisioning
  11. 11. Créateur de Criteria for good development environments • Isolated • Same tools for production
  12. 12. Créateur de Development Environments XAMPP/MAMP Vagrant Golden Image some undefined VM/local system Vagrant with Provisioning
  13. 13. Créateur de Criteria for good development environments • Isolated • Same tools for production • Reproducible
  14. 14. Créateur de Development Environments Vagrant Golden Image some undefined VM/local system Vagrant with Provisioning
  15. 15. Créateur de Criteria for good development environments • Isolated • Same tools for production • Reproducible • EASY!
  16. 16. Créateur de Development Environments Golden Image Vagrant with Provisioning
  17. 17. Créateur de VAGRANT http://www.hashicorp.com/ http://www.vagrantup.com/
  18. 18. Créateur de Vagrant VirtualBox VM
 ! dev.smoov.io Vagrant Vagrantfile
 
 "name = dev.smoov.io" project $ vagrant up Base Box 21
  19. 19. Créateur de ! Vagrantfile Vagrant.configure("2") do |config| ! config.vm.box = "precise64" config.vm.network "private_network", ip: "192.168.56.10" config.vm.hostname = "dev.smoov.io" ! config.vm.provider :virtualbox do |virtualbox| virtualbox.customize ["modifyvm", :id, "--name", "dev.smoov.io"] virtualbox.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] virtualbox.customize ["modifyvm", :id, "--memory", "1024"] end ! config.ssh.keep_alive = true config.ssh.forward_agent = true ! end assign provider specific configs keep this in mind!
  20. 20. Créateur de vagrant destroy is your friend!
  21. 21. Créateur de Available Base Boxes • Ubuntu Lucid 32 Bit (10.04) • Ubuntu Lucid 64 Bit (10.04) • Ubuntu Precise 32 Bit (12.04) • Ubuntu Precise 64 Bit (12.04) • https://github.com/mitchellh/vagrant/wiki/Available-Vagrant- Boxes • https://cloud-images.ubuntu.com/vagrant/ • other inofficial userland boxes: vagrantboxes.es, puphpet.com … What is in there!?
  22. 22. Créateur de Native supported base boxes are not up- to-date in the most cases PHP 5.3 nginx 0.9 Apache 1 not node compatible http://www.flickr.com/photos/yoshimov/13909857/ PPAs :(
  23. 23. Créateur de Can I haz the new things please? PHP 5.5.9 nginx 1.6 Apache 2 node! http://www.flickr.com/photos/chaosandcreations/2325239486/ PPAs not needed
  24. 24. Créateur de Can I? Pleeeease!
  25. 25. Créateur de Sure!
  26. 26. Créateur de Wait until new base boxes will be supported! http://www.flickr.com/photos/bogenfreund/556656621/
  27. 27. Créateur de Not really!
  28. 28. Créateur de Just build your own base box if you need to!
  29. 29. Créateur de … and that's now!
  30. 30. Créateur de Packer! http://www.hashicorp.com/ http://www.packer.io/
  31. 31. Créateur de Follow @mitchellh for updates!
  32. 32. Créateur de ! Base Box defined with simple JSON configuration        "builders":  [                  {                          "guest_os_type":  "Ubuntu_64",                          "iso_url":  "http://releases.ubuntu.com/14.04/ubuntu-­‐14.04-­‐server-­‐amd64.iso",                          "shutdown_command":  "echo  'vagrant'  |  sudo  -­‐S  shutdown  -­‐P  now",                          "type":  "virtualbox-­‐iso"                  }          ],          "post-­‐processors":  [                  {                          "only":  ["virtualbox-­‐iso"],                          "type":  "vagrant",                          "output":  "build/packer_ubuntu-­‐14.04_{{.Provider}}.box"
  33. 33. Créateur de Provisioning - with plain shell scripts "provisioners":  [          {  […]                    "script":  "scripts/install.sh",                  "type":  "shell"          […]  }   ] # scripts/install.sh apt-get -y update apt-get -y -q install linux-headers-$(uname -r) build-essential dkms nfs-common ! # ... install VBoxGuestAdditions, prepare Vagrant user etc. ! # install everything for Puppet3+Hiera apt-get install -y puppet
  34. 34. Créateur de Provisioning - with Puppet "provisioners":  [          {  […]                    "type":  "puppet-­‐masterless",                  "manifest_file":  "puppet/manifests/lamp.pp",                  "module_paths":  ["puppet/modules"]          […]  }   ] • Provisioning types could be mixed • Puppet has to be installed within Shell Provisioning first
  35. 35. Créateur de Resulting VM could be converted to a Vagrant box or whatever "builders":  […],   "post-­‐processors":  [          {                  "only":  ["virtualbox-­‐iso"],                  "type":  "vagrant",                  "output":  "buildpacker_ubuntu-­‐14.04_{{.Provider}}.box"          }   ]
  36. 36. Créateur de … and it comes with cool magic!
  37. 37. Créateur de "builders": [ { "boot_command": [ "<esc><esc><enter><wait>", "/install/vmlinuz noapic preseed/url=http:// {{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>", "debian-installer=en_US auto locale=en_US kbd- chooser/method=us <wait>", "hostname={{ .Name }} <wait>", "fb=false debconf/frontend=noninteractive <wait>", "keyboard-configuration/modelcode=SKIP keyboard- configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false <wait>", "initrd=/install/initrd.gz -- <enter><wait>" ],
  38. 38. Créateur de Demo: 
 Generating a Base Box for Vagrant with Packer in 3min
  39. 39. Créateur de http://youtu.be/wgt9jUyuXVI
  40. 40. Créateur de Base Box is generated! What's next?
  41. 41. Créateur de Integrate it to your Vagrant setup! vagrant  box  add  packer_ubuntu-­‐14.04_virtualbox  file://…
  42. 42. Créateur de ! Vagrantfile Vagrant.configure("2") do |config| ! config.vm.box = config.vm.network "private_network", ip: "192.168.56.10" config.vm.hostname = "dev.smoov.io" ! config.vm.provider :virtualbox do |virtualbox| virtualbox.customize ["modifyvm", :id, "--name", "dev.smoov.io"] virtualbox.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] virtualbox.customize ["modifyvm", :id, "--memory", "1024"] end ! config.ssh.keep_alive = true config.ssh.forward_agent = true ! end "precise64""packer_ubuntu-14.04_virtualbox"
  43. 43. Créateur de Packer + Vagrant VirtualBox VM
 ! dev.smoov.io Vagrant Base BoxVagrantfile
 
 "name = dev.smoov.io" project $ Packer Base BoxVM 1 2 3 vagrant up
  44. 44. Créateur de What to put in Base Boxes?
  45. 45. Créateur de Everything?
  46. 46. Créateur de Fat Base Box Fat Base Box
 
 included:
 PHP 5
 MySQL
 Redis
 nginx
  47. 47. Créateur de Fat Base Box • advantages: • vagrant up -> ultrafast • no internet connection needed during VM creation • disadvantages: • out-of-date very fast • heavy maintenance needed • one fat base box for every server type (webserver, database server, search server etc.) • … or do you want PHP to be installed on a DB node?
  48. 48. Créateur de Fat vs. Slim Base Box Fat Base Box
 
 ISO
 VBoxGuestAdditions
 
 PHP 5
 MySQL
 Redis
 nginx Slim Base Box
 
 ISO
 VBoxGuestAdditions 
 + Provisioning (Puppet)
  49. 49. Créateur de Choose wisely according to your needs!
  50. 50. Créateur de … but …
  51. 51. Créateur de Slim Base Boxes should be preferred when infrastructure changes often!
  52. 52. Créateur de Usage Fat Base Box
 ! • no changes • System is well known • Golden Image way • Admins are defining the system Slim Base Box • frequent changes • System is not yet defined • Developers are defining the system
  53. 53. Créateur de Slim Base Boxes need additional provisioning after Virtual Machine has been installed!
  54. 54. Créateur de Provisioning with Puppet VM Box
 ! dev.smoov.io Vagrant Base BoxVagrantfile
 
 "name = dev.smoov.io" project $ Packer Base BoxVM 1 2 4Puppet 3 vagrant up
  55. 55. Créateur de Vagrantfile Vagrant.configure(VAGRANTFILE_API_VERSION)  do  |config|      config.vm.box  =  "packer_ubuntu-­‐14.04_virtualbox"            #  …   !    config.vm.provision  :puppet  do  |puppet|          puppet.manifest_file  =  "lamp.pp"          puppet.manifests_path  =  "puppet/manifests"          puppet.module_path  =  "puppet/modules"          puppet.options  =  ["-­‐-­‐verbose"]      end   end   our generated Base Box from Packer Provisioning with Puppet
  56. 56. Créateur de Why Puppet?
  57. 57. Créateur de Why Not?
  58. 58. Créateur de Go for Chef or Ansible if you want!
  59. 59. Créateur de Puppet <3
  60. 60. Créateur de Puppet (2) - DSL Overview Variables Conditionals Facts Modules Classes Templates Defined Types
  61. 61. Créateur de Puppet – DSL - Modules puppet/ |-- manifests | `-- lamp.pp `-- modules |-- apache2 | |-- files | | `-- staticfile.conf | |-- manifests | | |-- init.pp | | |-- mod.pp | | `-- vhost.pp | `-- templates | `-- vhost.erb |-- composer | `-- manifests | `-- init.pp puppet/ |… `-- modules |… `-- php5 `-- manifests `-- init.pp
  62. 62. Créateur de Puppet DSL - Class Definition:   class  composer(      $dir    =  '/usr/local/bin'   )  {      exec  {  'composer_install':          name        =>  'curl  -­‐s  getcomposer.org/installer  |  php',          cwd          =>  $dir,          creates  =>  '/usr/local/bin/composer.phar',          path        =>  '/usr/bin'      }      #  ...   } Usage:   class  {  'composer':      dir  =>  $composer_dir   }
  63. 63. Créateur de Puppet DSL - Defined Type Definition:   define  apache2::vhost(          $server_name      =  $name,          $priority            =  '50',          $document_root  =  '/var/www',          $index_file        =  'index.php',          $service              =  apache2:params:service   )  {      #  ...   }   Usage:   apache2::vhost  {  'dev.smoov.io':      priority            =>  20,      document_root  =>  '/var/www/smoovio/web',      index_file        =>  'app_dev.php'   }  
  64. 64. Créateur de Puppet DSL - Manifest #  manifests/dev.pp      #  ...      class  {  'apache2':  }      -­‐>      apache2::vhost  {  'dev.smoov.io':          priority            =>  20,          document_root  =>  '/var/www/smoovio/web',          index_file        =>  'app_dev.php'      }      -­‐>class  {  'php5':  }
    -­‐>class  {  'composer':  }      #  ...  
  65. 65. Créateur de Infrastructure as Code
  66. 66. Créateur de To sum up • with Vagrant you can create Virtual Machines bases on Base Boxes very easy • Packer adds the possibility to create your own Base Box for those VMs • It's up to you if you create a Fat or a Thin Base Box • After creation a Virtual Machine could be provisioned with Puppet (or place your preferred provisioning tool here)
  67. 67. Créateur de Need more Information or Help!? http://sensiolabs.de/workshops/vagrant/ packer build <your own base box>.json … now! Frank Stelzer
 @frastel

×