Vagrant - Version control your dev environment

Post on 06-May-2015

1.432 views 0 download

description

Vagrant facilitates the creation and configuration of lightweight, reproducible, and portable development environments. It is currently in use at companies like Disqus, BBC, Mozilla, Nokia, and O'Reilly Media. More information about Vagrant is available at: http://www.vagrantup.com/ Links: Boxes: https://github.com/opscode/bento Cookbooks: http://community.opscode.com/ LAMP demo: https://github.com/bocribbz/cookbook-lampdemo

Transcript of Vagrant - Version control your dev environment

VagrantVersion control your dev environment

Bob Cribbs

Bob Cribbs

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

bocribbz.com

bocribbz bocribbz

bocribbzbocribbz

bocribbz

www.vagrantup.com

Development environments

made easy.

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.gitCloning into super_projectnewguy$ cd super_project

newguy$ ...

newguy$ ./start.shServer listening on 127.0.0.1

newguy$ ./setup.shInstalling software.Installing dependencies.Configuring.Success!

We have a setup script!

We have a setup script!

● multiple ecosystems Win/Linux/MacOS

● multiple package managers yum, apt, home-

brew, 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.shFailed to connect to MySql at localhost:3333newguy$ install mysql

newguy$ start.shFailed to connect to Redis at localhost:3334newguy$ install redis

newguy$ start.shMissing ImageMagick extensions.newguy$ install imagemagick

newguy$ start.shServer 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!

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

Vagrant

Problems solved

Repeatableyou can do the exact same thing when needed

Verifiably correctyou should have automation to check this

Isolatedits in a virtual machine (Vbox, VMWare, etc.)

UnderstandableYou can read it to understand

Fast(er)It still takes some time, but it is much faster

Boxestemplates for creating a machine, preinstalled OS

Some Terms

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

Boxestemplates for creating a machine, preinstalled OS

Vagrantfileconfiguration read by vagrant to create your machine

Vagrantfile samplesVagrant.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

Boxestemplates for creating a machine, preinstalled OS

Vagrantfileconfiguration read by vagrant to create your machine

"vagrant" commandmanages 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

newguy$ git clone git://path-to-code-repo/super_project.gitCloning into super_projectnewguy$ cd super_project

newguy$ vagrant up

You’re hired. Get the project up and running on your new machine.

Overview

1. Project specific configuration file

2. Import base box

3. Boot up virtual machinea. 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 foldersVMWare shared folderrsync (for AWS)etc...

Synced Folders configVagrant.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 forwardingHost-Only: private networkBridge: act like a new device on the router/network

Networking configVagrant.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.

BerkshelfCreate and manage cookbooks that install and configure software dependencies.ChefAutomation platform and nodes manager.Transforms infrastructure into code.

Provisioning configsVagrant.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

Examplehttps://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!