Vagrant
Version control your dev environment

Bob Cribbs
Bob Cribbs
Software developer.
Focused mainly on Python, junior on Ruby and
getting started with mobile.
bocribbz

bocribbz

bocribbz

bocribbz

bocribbz

bocribbz.com
Development
environments
made easy.

www.vagrantup.com

Brasov Tech Meet | September 2013
You’re hired. Get the project up and running
on your new machine.
newguy$ git clone git://path-to-code-repo/super_project.git
Cloning into super_project
newguy$ cd super_project
newguy$ ...
newguy$ ./start.sh
Server listening on 127.0.0.1
We have a setup script!
newguy$ ./setup.sh
Installing software.
Installing dependencies.
Configuring.
Success!
We have a setup script!
● multiple ecosystems Win/Linux/MacOS
● multiple package managers yum, apt, homebrew, macports
● its likely some configuration will be done
differently
● its likely it will diverge from the production
environment
We have a README!
It gives precise instructions about what should
be installed and how it should be configured.

For a mature project, the README file ends up
being a few screens long.
We have a README!
● multiple ecosystems Win/Linux/MacOS
● very high chances something will be
misconfigured
● unlikely to be maintained, (most) developers
don’t write English
● time consuming
I’m sure you can do it!
newguy$ start.sh
Failed to connect to MySql at localhost:3333
newguy$ install mysql
newguy$ start.sh
Failed to connect to Redis at localhost:3334
newguy$ install redis
newguy$ start.sh
Missing ImageMagick extensions.
newguy$ install imagemagick
newguy$ start.sh
Server listening on 127.0.0.1
I’m sure you can do it!
Internal Server Error!
Problems
Not repeatable.
Not verifiably correct.
Not isolated.
Difficult to understand.
Problems
Not repeatable.
Not verifiably correct.
Not isolated.
Difficult to understand.

SLOW, SLOW, SLOW!
Vagrant
Its a tool for creating, managing and distributing
portable development environments.
Zero to VM in seconds
$ vagrant init precise32 
http://files.vagrantup.com/precise32.box
...
$ vagrant up
...
$ vagrant ssh
vagrant@precisebox32:~$ echo hello
hello
Problems solved
Repeatable
you can do the exact same thing when needed

Verifiably correct
you should have automation to check this

Isolated
its in a virtual machine (Vbox, VMWare, etc.)

Understandable
You can read it to understand

Fast(er)
It still takes some time, but it is much faster
Some Terms
Boxes
templates for creating a machine, preinstalled OS
Boxes
Snapshots / base operating system images.
Initial state of the VM.
Operating system (Ubuntu 12.04, CentOS 5.9,
etc.)
Can be packaged and shared.
eg. https://github.com/opscode/bento
Some Terms
Boxes
templates for creating a machine, preinstalled OS

Vagrantfile
configuration read by vagrant to create your machine
Vagrantfile samples
Vagrant.configure("2") do |config|
config.vm.box = "precise32"
end

Vagrant.configure("2") do |config|
config.vm.box = "precise32"
config.vm.provision "shell"
inline "apt-get update"
config.vm.provision "shell"
inline "apt-get install apache2"
end
Some Terms
Boxes
templates for creating a machine, preinstalled OS

Vagrantfile
configuration read by vagrant to create your machine

"vagrant" command
manages life cycle of the environment
"vagrant" command
vagrant init

Create a Vagrantfile in the current directory
vagrant up

Boot the VM
vagrant halt

Shutdown the VM
vagrant destroy

Delete the virtual machine
vagrant ssh

SSH into the VM
You’re hired. Get the project up and running
on your new machine.
newguy$ git clone git://path-to-code-repo/super_project.git
Cloning into super_project
newguy$ cd super_project
newguy$ vagrant up
Overview
1. Project specific configuration file
2. Import base box
3. Boot up virtual machine
a. Synced folders
b. Networking

4. Configure / provision software
Synced Folders
Automatically sync files from host to guest so
you can use your prefered editor on the host.
VirtualBox shared folders
VMWare shared folder
rsync (for AWS)
etc...
Synced Folders config
Vagrant.configure("2") do |config|
# ...
config.vm.shared_folder "path/on/host/",
"/path/on/guest/"
end
Networking
Configure how you will communicate with the VM or how
multiple VMs communicate with each other.
You can still use your prefered browser or tools to
communicate with the guest servers.
NAT: usually for port forwarding
Host-Only: private network
Bridge: act like a new device on the router/network
Networking config
Vagrant.configure("2") do |config|
# ...
config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :private_network, ip: "192.168.3.10"
config.vm.network :public_network
end
Provisioning
You can use shell scripts, Puppet or Chef to
install and configure software.
Berkshelf
Create and manage cookbooks that install and
configure software dependencies.
Chef
Automation platform and nodes manager.
Transforms infrastructure into code.
Provisioning configs
Vagrant.configure("2") do |config|
# ...
config.vm.provision "shell", script "setup.sh"
end
Berkshelf
Manage cookbook and it’s dependencies.
http://community.opscode.com/
Create new cookbook and boilerplate configuration:
berks cookbook cookbook-projectname
Example
https://github.com/bocribbz/cookbook-lampdemo
LAMP demo
Show how Vagrant and Berkshelf work together.
Simple cookbook that installs Ubuntu, Apache,
MySQL, PHP and shows phpinfo().
LAMP demo
berks cookbook cookbook-lampdemo
LAMP demo - Vagrantfile
LAMP demo - metadata.rb
LAMP demo - Apache attributes
Setting attributes/apache.rb paths and other
variables used in the recipe.
LAMP demo - Apache recipe
LAMP demo - PHP recipe
LAMP demo - MySQL attrs & recipe
LAMP demo - vagrant up
LAMP demo
Questions
Thank you!

Vagrant - Version control your dev environment

  • 1.
    Vagrant Version control yourdev environment Bob Cribbs
  • 2.
    Bob Cribbs Software developer. Focusedmainly on Python, junior on Ruby and getting started with mobile. bocribbz bocribbz bocribbz bocribbz bocribbz bocribbz.com
  • 3.
  • 4.
    You’re hired. Getthe project up and running on your new machine. newguy$ git clone git://path-to-code-repo/super_project.git Cloning into super_project newguy$ cd super_project newguy$ ... newguy$ ./start.sh Server listening on 127.0.0.1
  • 5.
    We have asetup script! newguy$ ./setup.sh Installing software. Installing dependencies. Configuring. Success!
  • 6.
    We have asetup script! ● multiple ecosystems Win/Linux/MacOS ● multiple package managers yum, apt, homebrew, macports ● its likely some configuration will be done differently ● its likely it will diverge from the production environment
  • 7.
    We have aREADME! It gives precise instructions about what should be installed and how it should be configured. For a mature project, the README file ends up being a few screens long.
  • 8.
    We have aREADME! ● multiple ecosystems Win/Linux/MacOS ● very high chances something will be misconfigured ● unlikely to be maintained, (most) developers don’t write English ● time consuming
  • 9.
    I’m sure youcan do it! newguy$ start.sh Failed to connect to MySql at localhost:3333 newguy$ install mysql newguy$ start.sh Failed to connect to Redis at localhost:3334 newguy$ install redis newguy$ start.sh Missing ImageMagick extensions. newguy$ install imagemagick newguy$ start.sh Server listening on 127.0.0.1
  • 10.
    I’m sure youcan do it! Internal Server Error!
  • 11.
    Problems Not repeatable. Not verifiablycorrect. Not isolated. Difficult to understand.
  • 12.
    Problems Not repeatable. Not verifiablycorrect. Not isolated. Difficult to understand. SLOW, SLOW, SLOW!
  • 13.
    Vagrant Its a toolfor creating, managing and distributing portable development environments. Zero to VM in seconds $ vagrant init precise32 http://files.vagrantup.com/precise32.box ... $ vagrant up ... $ vagrant ssh vagrant@precisebox32:~$ echo hello hello
  • 14.
    Problems solved Repeatable you cando the exact same thing when needed Verifiably correct you should have automation to check this Isolated its in a virtual machine (Vbox, VMWare, etc.) Understandable You can read it to understand Fast(er) It still takes some time, but it is much faster
  • 15.
    Some Terms Boxes templates forcreating a machine, preinstalled OS
  • 16.
    Boxes Snapshots / baseoperating system images. Initial state of the VM. Operating system (Ubuntu 12.04, CentOS 5.9, etc.) Can be packaged and shared. eg. https://github.com/opscode/bento
  • 17.
    Some Terms Boxes templates forcreating a machine, preinstalled OS Vagrantfile configuration read by vagrant to create your machine
  • 18.
    Vagrantfile samples Vagrant.configure("2") do|config| config.vm.box = "precise32" end Vagrant.configure("2") do |config| config.vm.box = "precise32" config.vm.provision "shell" inline "apt-get update" config.vm.provision "shell" inline "apt-get install apache2" end
  • 19.
    Some Terms Boxes templates forcreating a machine, preinstalled OS Vagrantfile configuration read by vagrant to create your machine "vagrant" command manages life cycle of the environment
  • 20.
    "vagrant" command vagrant init Createa Vagrantfile in the current directory vagrant up Boot the VM vagrant halt Shutdown the VM vagrant destroy Delete the virtual machine vagrant ssh SSH into the VM
  • 21.
    You’re hired. Getthe project up and running on your new machine. newguy$ git clone git://path-to-code-repo/super_project.git Cloning into super_project newguy$ cd super_project newguy$ vagrant up
  • 22.
    Overview 1. Project specificconfiguration file 2. Import base box 3. Boot up virtual machine a. Synced folders b. Networking 4. Configure / provision software
  • 23.
    Synced Folders Automatically syncfiles from host to guest so you can use your prefered editor on the host. VirtualBox shared folders VMWare shared folder rsync (for AWS) etc...
  • 24.
    Synced Folders config Vagrant.configure("2")do |config| # ... config.vm.shared_folder "path/on/host/", "/path/on/guest/" end
  • 25.
    Networking Configure how youwill communicate with the VM or how multiple VMs communicate with each other. You can still use your prefered browser or tools to communicate with the guest servers. NAT: usually for port forwarding Host-Only: private network Bridge: act like a new device on the router/network
  • 26.
    Networking config Vagrant.configure("2") do|config| # ... config.vm.network :forwarded_port, guest: 80, host: 8080 config.vm.network :private_network, ip: "192.168.3.10" config.vm.network :public_network end
  • 27.
    Provisioning You can useshell scripts, Puppet or Chef to install and configure software. Berkshelf Create and manage cookbooks that install and configure software dependencies. Chef Automation platform and nodes manager. Transforms infrastructure into code.
  • 28.
    Provisioning configs Vagrant.configure("2") do|config| # ... config.vm.provision "shell", script "setup.sh" end
  • 29.
    Berkshelf Manage cookbook andit’s dependencies. http://community.opscode.com/ Create new cookbook and boilerplate configuration: berks cookbook cookbook-projectname
  • 30.
  • 31.
    LAMP demo Show howVagrant and Berkshelf work together. Simple cookbook that installs Ubuntu, Apache, MySQL, PHP and shows phpinfo().
  • 32.
    LAMP demo berks cookbookcookbook-lampdemo
  • 33.
    LAMP demo -Vagrantfile
  • 34.
    LAMP demo -metadata.rb
  • 35.
    LAMP demo -Apache attributes Setting attributes/apache.rb paths and other variables used in the recipe.
  • 36.
    LAMP demo -Apache recipe
  • 37.
    LAMP demo -PHP recipe
  • 38.
    LAMP demo -MySQL attrs & recipe
  • 39.
    LAMP demo -vagrant up
  • 40.
  • 41.
  • 42.