config managament for development environments ii

55
gareth rushgrove | morethanseven.net Configuration Management for Development Environments LRUG 8th August 2011 http://www.flickr.com/photos/36144637@N00/159627088/

Upload: gareth-rushgrove

Post on 13-May-2015

3.522 views

Category:

Technology


2 download

DESCRIPTION

Talk for the London Ruby User Group about using configuration management tools to manage development environments. Lots of Vagrant and Chef code examples.

TRANSCRIPT

Page 1: Config managament for development environments ii

gareth rushgrove | morethanseven.net

Configuration Managementfor Development Environments

LRUG 8th August 2011

http://www.flickr.com/photos/36144637@N00/159627088/

Page 2: Config managament for development environments ii

Gareth Rushgrove

gareth rushgrove | morethanseven.net

Page 3: Config managament for development environments ii

Blog at morethanseven.net

gareth rushgrove | morethanseven.net

Page 4: Config managament for development environments ii

Curate devopsweekly.com

gareth rushgrove | morethanseven.net

Page 5: Config managament for development environments ii

http://www.flickr.com/photos/iancarroll/5027441664gareth rushgrove | morethanseven.net

Problems

Page 6: Config managament for development environments ii

http://www.flickr.com/photos/34652102@N04/5059217055gareth rushgrove | morethanseven.net

1. Not all developers want to be sysadmins

Page 7: Config managament for development environments ii

http://www.flickr.com/photos/34652102@N04/5059824808gareth rushgrove | morethanseven.net

2. New team members getting started time

Page 8: Config managament for development environments ii

http://www.flickr.com/photos/biggreymare

3. Running a full set of services locally

gareth rushgrove | morethanseven.net

Page 9: Config managament for development environments ii

4. Works on my machine

gareth rushgrove | morethanseven.net

Page 10: Config managament for development environments ii

⚡ brew info mysqlmysql 5.5.14

$ aptitude show mysql-serverPackage: mysql-serverState: not installedVersion: 5.1.41-3ubuntu12.10

Homebrew is great but...

gareth rushgrove | morethanseven.net

Page 11: Config managament for development environments ii

What’s a few versions between friends?

gareth rushgrove | morethanseven.net

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

23 releases and 21 months in-between 5.1.41 and 5.5.14. Here’s some fixed bugs:

And lots more

Page 12: Config managament for development environments ii

Spot the cross platform bug (not the security flaw)

gareth rushgrove | morethanseven.net

Page 13: Config managament for development environments ii

⚡ ./server.rb &⚡ curl "http://127.0.0.1:8181/?query=Bob"⚡ curl "http://127.0.0.1:8181/?query=bob"⚡ lsBob⚡ cat BobHello bob

On our Mac

gareth rushgrove | morethanseven.net

Page 14: Config managament for development environments ii

$ ./server.rb &$ curl "http://127.0.0.1:8181/?query=Bob"$ curl "http://127.0.0.1:8181/?query=bob"$ lsBob bob$ cat BobHello Bob$ cat bobHello bob

On Linux

gareth rushgrove | morethanseven.net

Page 15: Config managament for development environments ii

gareth rushgrove | morethanseven.net http://www.flickr.com/photos/34652102@N04/5059208501

Solutions

Page 16: Config managament for development environments ii

http://www.flickr.com/photos/dawilson/2598713027

Virtualisation

gareth rushgrove | morethanseven.net

Page 17: Config managament for development environments ii

VirtualBox

gareth rushgrove | morethanseven.net

Page 18: Config managament for development environments ii

VMware

gareth rushgrove | morethanseven.net

Page 19: Config managament for development environments ii

Virtualisation needs powerful hardware

gareth rushgrove | morethanseven.net http://www.flickr.com/photos/martinoc/477335951

Page 20: Config managament for development environments ii

gareth rushgrove | morethanseven.net http://www.flickr.com/photos/peteradams/2272928740

What about editing code?

Page 21: Config managament for development environments ii

http://www.flickr.com/photos/34652102@N04/5059846582

Shared Folders or NFS

gareth rushgrove | morethanseven.net

Page 22: Config managament for development environments ii

Doubledown

Page 23: Config managament for development environments ii

Vim

gareth rushgrove | morethanseven.net

Page 24: Config managament for development environments ii

Vagrantup.com

gareth rushgrove | morethanseven.net

Page 25: Config managament for development environments ii

What is Vagrant?

gareth rushgrove | morethanseven.net

- 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

Page 26: Config managament for development environments ii

http://www.flickr.com/photos/dawilson/2793319903

Base boxes

gareth rushgrove | morethanseven.net

Page 27: Config managament for development environments ii

VeeWee

gareth rushgrove | morethanseven.net

Page 28: Config managament for development environments ii

gareth rushgrove | morethanseven.net

Community boxes

Page 29: Config managament for development environments ii

⚡ gem install vagrant⚡ vagrant box add lucid32 http://.../lucid32.box⚡ vagrant init⚡ vagrant up

Vagrant up

gareth rushgrove | morethanseven.net

Page 30: Config managament for development environments ii

⚡ lsVagrantfile⚡ vagrant up⚡ vagrant ssh⚡ vagrant reload⚡ vagrant halt⚡ vagrant destroy

Vagrant command line

gareth rushgrove | morethanseven.net

Page 31: Config managament for development environments ii

⚡ vagrant ssh-configHost default HostName 127.0.0.1 User vagrant Port 2222 IdentityFile /Users/.../vagrant-0.8.2/keys/vagrant ...

Export SSH configuration

gareth rushgrove | morethanseven.net

Page 32: Config managament for development environments ii

Vagrant::Config.run do |config| config.vm.box = "lucid32"end

Vagrantfile

gareth rushgrove | morethanseven.net

Page 33: Config managament for development environments ii

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

Page 34: Config managament for development environments ii

Vagrant::Config.run do |config| config.vm.share_folder("folder", "/guest", "../host")end

Shared folders

gareth rushgrove | morethanseven.net

Page 35: Config managament for development environments ii

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) endend

Multiple VMs in one file

gareth rushgrove | morethanseven.net

Page 36: Config managament for development environments ii

Vagrant::Config.run do |config| config.vm.boot_mode = :gui config.ssh.forward_agent = true config.vm.customize do |vm| vm.memory_size = 512 endend

Lots more options

gareth rushgrove | morethanseven.net

Page 37: Config managament for development environments ii

Puppet

gareth rushgrove | morethanseven.net

Page 38: Config managament for development environments ii

Vagrant provisioning with Puppet

gareth rushgrove | morethanseven.net

Vagrant::Config.run do |config| config.vm.provision :puppet do |puppet| puppet.manifests_path = "puppetmanifests" puppet.manifest_file = "newbox.pp" endend

Page 39: Config managament for development environments ii

Chef

gareth rushgrove | morethanseven.net

Page 40: Config managament for development environments ii

Vagrant provisioning with Chef

gareth rushgrove | morethanseven.net

Vagrant::Config.run do |config| config.vm.provision :chef_solo do |chef| chef.add_recipe = "garethr" chef.cookbooks_path = “cookbooks” endend

Page 41: Config managament for development environments ii

Specifying Chef roles

gareth rushgrove | morethanseven.net

Vagrant::Config.run do |config| config.vm.provision :chef_solo do |chef| chef.roles_path = "roles" chef.add_role("vm") endend

Page 42: Config managament for development environments ii

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" }}) endend

gareth rushgrove | morethanseven.net

Remote file

Page 43: Config managament for development environments ii

http://www.flickr.com/photos/s3a/4710416678

Plugins

gareth rushgrove | morethanseven.net

- Vagrant Hosts - https://github.com/dwt/vagrant-hosts- Sahara - https://github.com/jedi4ever/sahara- Vagrantboxes - https://github.com/garethr/ruby-vagrantboxes

Page 44: Config managament for development environments ii

http://www.flickr.com/photos/crustyscumbrothersontour/2674351601

Local configuration management

gareth rushgrove | morethanseven.net

Page 45: Config managament for development environments ii

gareth rushgrove | morethanseven.net

Real world example

gareth rushgrove | morethanseven.netgareth rushgrove | morethanseven.net

- 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

Page 46: Config managament for development environments ii

⚡ cd /m/somefolder⚡ tree├── Vagrantfile└── cookbooks └── garethr ├── attributes │   └── default.rb ├── files │   └── default │   └── zshrc └── recipes └── default.rb

Chef cookbook layout

gareth rushgrove | morethanseven.net

Page 47: Config managament for development environments ii

Packages I like

gareth rushgrove | morethanseven.net

%w{zsh wget curl lynxgit-core ack-grep vim-noxdvtm build-essential tree}.each do |pkg| package pkg do action :install endend

Page 48: Config managament for development environments ii

My shell configs

gareth rushgrove | morethanseven.net

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

Page 49: Config managament for development environments ii

Attributes

gareth rushgrove | morethanseven.net

default[:garethr][:dotvim] = "https://github.com/carlhuda/janus.git"

default[:garethr][:ohmyzsh] = "https://github.com/robbyrussell/oh-my-zsh.git"

Page 50: Config managament for development environments ii

My Vim configs

gareth rushgrove | morethanseven.net

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

Page 51: Config managament for development environments ii

Testing with ChefSpec

gareth rushgrove | morethanseven.net

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" endend

Page 52: Config managament for development environments ii

gareth rushgrove | morethanseven.net

Awesome things I ignored

gareth rushgrove | morethanseven.netgareth rushgrove | morethanseven.net

- 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

Page 53: Config managament for development environments ii

gareth rushgrove | morethanseven.net

Conclusions

gareth rushgrove | morethanseven.netgareth rushgrove | morethanseven.net

- 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

Page 54: Config managament for development environments ii

More information

gareth rushgrove | morethanseven.net

- IRC - #vagrant on Freenode- Github Issues - https://github.com/mitchellh/vagrant/issues- Google Groups - http://groups.google.com/group/vagrant-up

Page 55: Config managament for development environments ii

Questions?

gareth rushgrove | morethanseven.net http://flickr.com/photos/psd/102332391/