Talk for the London Ruby User Group about using configuration management tools to manage development environments. Lots of Vagrant and Chef code examples.
1. Configuration Management
for Development Environments
LRUG 8th August 2011
gareth rushgrove | morethanseven.net http://www.flickr.com/photos/36144637@N00/159627088/
6. 1. Not all developers want to be sysadmins
gareth rushgrove | morethanseven.net http://www.flickr.com/photos/34652102@N04/5059217055
7. 2. New team members getting started time
gareth rushgrove | morethanseven.net http://www.flickr.com/photos/34652102@N04/5059824808
8. 3. Running a full set of services locally
gareth rushgrove | morethanseven.net http://www.flickr.com/photos/biggreymare
9. 4. Works on my machine
gareth rushgrove | morethanseven.net
10. ⚡ brew info mysql
mysql 5.5.14
$ aptitude show mysql-server
Package: mysql-server
State: not installed
Version: 5.1.41-3ubuntu12.10
Homebrew is great but...
gareth rushgrove | morethanseven.net
11. 23 releases and 21 months in-between 5.1.41 and 5.5.14. Here’s
some fixed bugs:
- An ORDER BY clause was bound to the incorrect substatement
when used in UNION context.
- A NOT IN predicate with a subquery containing a HAVING clause
could retrieve too many rows, when the subquery itself returned
NULL.
- MIN(year_col) could return an incorrect result in some cases.
And lots more
What’s a few versions between friends?
gareth rushgrove | morethanseven.net
12. Spot the cross platform bug (not the security flaw)
gareth rushgrove | morethanseven.net
13. ⚡ ./server.rb &
⚡ curl "http://127.0.0.1:8181/?query=Bob"
⚡ curl "http://127.0.0.1:8181/?query=bob"
⚡ ls
Bob
⚡ cat Bob
Hello bob
On our Mac
gareth rushgrove | morethanseven.net
14. $ ./server.rb &
$ curl "http://127.0.0.1:8181/?query=Bob"
$ curl "http://127.0.0.1:8181/?query=bob"
$ ls
Bob bob
$ cat Bob
Hello Bob
$ cat bob
Hello bob
On Linux
gareth rushgrove | morethanseven.net
25. - Automated virtual machine creation using Oracle’s VirtualBox
- Automated provisioning of virtual environments using Chef or Puppet
- Full SSH access to created environments
- Assign a static IP to your VM, accessible from your machine
- Forward ports to the host machine
- Shared folders allows you to continue using your own editor
- Package environments into distributable boxes
- Completely tear down environment when you’re done
- Easily rebuild a complete environment with a single command
What is Vagrant?
gareth rushgrove | morethanseven.net
33. Vagrant::Config.run do |config|
config.vm.forward_port("web", 80, 8080)
config.vm.forward_port("ftp", 21, 4567)
config.vm.forward_port("ssh", 22, 2222, :auto => true)
end
Port forwarding
gareth rushgrove | morethanseven.net
34. Vagrant::Config.run do |config|
config.vm.share_folder("folder", "/guest", "../host")
end
Shared folders
gareth rushgrove | morethanseven.net
35. Vagrant::Config.run do |config|
config.vm.define :web do |web_config|
web_config.vm.box = "web"
web_config.vm.forward_port("http", 80, 8080)
end
config.vm.define :db do |db_config|
db_config.vm.box = "db"
db_config.vm.forward_port("db", 3306, 3306)
end
end
Multiple VMs in one file
gareth rushgrove | morethanseven.net
36. Vagrant::Config.run do |config|
config.vm.boot_mode = :gui
config.ssh.forward_agent = true
config.vm.customize do |vm|
vm.memory_size = 512
end
end
Lots more options
gareth rushgrove | morethanseven.net
38. Vagrant::Config.run do |config|
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppetmanifests"
puppet.manifest_file = "newbox.pp"
end
end
Vagrant provisioning with Puppet
gareth rushgrove | morethanseven.net
40. Vagrant::Config.run do |config|
config.vm.provision :chef_solo do |chef|
chef.add_recipe = "garethr"
chef.cookbooks_path = “cookbooks”
end
end
Vagrant provisioning with Chef
gareth rushgrove | morethanseven.net
41. Vagrant::Config.run do |config|
config.vm.provision :chef_solo do |chef|
chef.roles_path = "roles"
chef.add_role("vm")
end
end
Specifying Chef roles
gareth rushgrove | morethanseven.net
42. Vagrant::Config.run do |config|
config.vm.provision :chef_solo do |chef|
chef.recipe_url = "http://github.com/cookbooks.tar.gz"
chef.add_recipe "garethr"
chef.cookbooks_path = [:vm, "cookbooks"]
chef.json.merge!({ :garethr => {
:ohmyzsh => "https://github.com/.../oh-my-zsh.git",
:dotvim => "https://github.com/garethr/dotvim.git"
}})
end
end
Remote file
gareth rushgrove | morethanseven.net
45. - I want my development environment everywhere
- I don’t want a wiki page of instructions
- I don’t want to have to manually install everything
- I don’t want to care about destroying a virtual machine
- So I have a simple Chef cookbook to bootstrap my machines
Real world example
gareth rushgrove | morethanseven.net
47. %w{zsh wget curl lynx
git-core ack-grep vim-nox
dvtm build-essential tree}.each do |pkg|
package pkg do
action :install
end
end
Packages I like
gareth rushgrove | morethanseven.net
48. git "/home/vagrant/.oh-my-zsh" do
repository node[:garethr][:ohmyzsh]
action :checkout
user "vagrant"
group "vagrant"
end
cookbook_file "/home/vagrant/.zshrc" do
source "zshrc"
owner "vagrant"
group "vagrant"
end
My shell configs
gareth rushgrove | morethanseven.net
50. git "/home/vagrant/.vim" do
repository node[:garethr][:dotvim]
action :checkout
user "vagrant"
end
execute "build janus" do
command "rake"
user "vagrant"
cwd "/home/vagrant/.vim"
environment ({'HOME' => '/home/vagrant'})
creates "/home/vagrant/.vimrc"
end
My Vim configs
gareth rushgrove | morethanseven.net
51. require "chefspec"
describe "garethr" do
before(:all) do
@chef_run = ChefSpec::ChefRunner.new
@chef_run.converge "garethr"
end
it "should install zsh" do
@chef_run.should install_package "zsh"
end
end
Testing with ChefSpec
gareth rushgrove | morethanseven.net
52. - The Chef Server
- Roles and Environments
- Knife and Shef
- Splitting the one file into multiple cookbooks
- Managing running services
- Simplifying cookbooks by creating system packages
- Supporting different operating systems
- The Chef architecture
- Testing with Cucumber-Chef
Awesome things I ignored
gareth rushgrove | morethanseven.net
53. - Using Virtualisation catches bugs early
- Using Vagrant makes using virtual machines pleasurable
- Storing configuration as code makes it shareable
- Able to apply development best practice to dev environments
Conclusions
gareth rushgrove | morethanseven.net
54. - IRC - #vagrant on Freenode
- Github Issues - https://github.com/mitchellh/vagrant/issues
- Google Groups - http://groups.google.com/group/vagrant-up
More information
gareth rushgrove | morethanseven.net