Talk for the London Ruby User Group about using configuration management tools to manage development environments. Lots of Vagrant and Chef code examples.
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
Config managament for development environments ii
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