Create your very own Development Environment with Vagrant and Packer
-
Upload
frastel -
Category
Technology
-
view
1.527 -
download
4
description
Transcript of Create your very own Development Environment with Vagrant and Packer
Create your very own Development Environment with Vagrant and Packer
… and a little bit of PuppetFrank Stelzer https://www.flickr.com/photos/eiriknewth/238681391
Créateur de
Agenda• Motivation
• Vagrant Introduction
• Base Boxes
• Creating an own Base Box with Packer
• Demo
• Fat vs. Thin Boxes
• Provisioning with Puppet
Créateur de
Vagrant
PuppetPacker
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 ServerXAMPP/MAMP
VagrantGolden Image
some undefined VM/local system
Vagrant with Provisioning
Créateur de
Criteria for good development environments
• Isolated
Créateur de
Development Environments
Shared Development ServerXAMPP/MAMP
VagrantGolden Image
some undefined VM/local system
Vagrant with Provisioning
Créateur de
Criteria for good development environments
• Isolated
• Same tools for production
Créateur de
Development Environments
XAMPP/MAMP
VagrantGolden Image
some undefined VM/local system
Vagrant with Provisioning
Créateur de
Criteria for good development environments
• Isolated
• Same tools for production
• Reproducible
Créateur de
Development Environments
VagrantGolden 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 Box21
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!
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.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!?
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 :(
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
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": [
{
"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"
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
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
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"
}
]
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://{{ .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>" ],
Créateur de
Demo: Generating a Base Box for
Vagrant with Packer in 3min
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: "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"
Créateur de
Packer + Vagrant
VirtualBox
VM!
dev.smoov.io
Vagrant
Base BoxVagrantfile
"name = dev.smoov.io"
project $
PackerBase BoxVM
1
2 3
vagrant up
Créateur de
What to put in Base Boxes?
Créateur de
Everything?
Créateur de
Fat Base Box
Fat Base Box
included:PHP 5MySQLRedis nginx
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?
Créateur de
Fat vs. Slim Base BoxFat Base Box
ISO
VBoxGuestAdditions
PHP 5MySQLRedisnginx
Slim Base Box
ISOVBoxGuestAdditions
+ Provisioning (Puppet)
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
UsageFat 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
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 $
PackerBase BoxVM
1
2
4Puppet
3
vagrant up
Créateur de
VagrantfileVagrant.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
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 - Modulespuppet/ |-- 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
Créateur de
Puppet DSL - ClassDefinition: 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 }
Créateur de
Puppet DSL - Defined TypeDefinition: 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' }
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': } # ...
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 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)
Créateur de
Need more Information or Help!?
http://sensiolabs.de/workshops/vagrant/
packer build <your own base box>.json … now!
Frank Stelzer@frastel