Create your very own Development Environment with Vagrant and Packer
- 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
- 15. Créateur de
Criteria for good development
environments
• Isolated
• Same tools for production
• Reproducible
• EASY!
- 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!
- 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. 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. 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
- 26. Créateur de
Wait until new base boxes
will be supported!
http://www.flickr.com/photos/bogenfreund/556656621/
- 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. 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. 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. 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"
}
]
- 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>"
],
- 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. 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
- 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. 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)
- 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
- 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. 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
- 60. Créateur de
Puppet (2) - DSL Overview
Variables
Conditionals
Facts
Modules
Classes
Templates
Defined Types
- 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. 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. 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. 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': }
# ...
- 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. Créateur de
Need more Information or Help!?
http://sensiolabs.de/workshops/vagrant/
packer build <your own base box>.json … now!
Frank Stelzer
@frastel