config managament for development environments iii

60
gareth rushgrove | morethanseven.net Configuration Management for Development Environments PuppetConf 22nd September 2011 http://www.flickr.com/photos/36144637@N00/159627088/

Upload: puppet-labs

Post on 13-May-2015

3.205 views

Category:

Technology


0 download

DESCRIPTION

Gareth rushgrove

TRANSCRIPT

Page 1: Config managament for development environments iii

gareth rushgrove | morethanseven.net

Configuration Managementfor Development Environments

PuppetConf 22nd September 2011

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

Page 2: Config managament for development environments iii

Gareth Rushgrove

gareth rushgrove | morethanseven.net

Page 3: Config managament for development environments iii

Work at UK Government Digital Service

gareth rushgrove | morethanseven.net

Page 4: Config managament for development environments iii

Blog at morethanseven.net

gareth rushgrove | morethanseven.net

Page 5: Config managament for development environments iii

Curate devopsweekly.com

gareth rushgrove | morethanseven.net

Page 6: Config managament for development environments iii

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

Problems

Page 7: Config managament for development environments iii

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

1. Not all developers want to be sysadmins

Page 8: Config managament for development environments iii

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

1. Sysadmins don’t want devs to be sysadmins

Page 9: Config managament for development environments iii

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

2. New team members getting started time

Page 10: Config managament for development environments iii

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

3. Running a full set of services locally

gareth rushgrove | morethanseven.net

Page 11: Config managament for development environments iii

4. Works on my machine

gareth rushgrove | morethanseven.net

Page 12: Config managament for development environments iii

⚡ 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 13: Config managament for development environments iii

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 14: Config managament for development environments iii

Spot the cross platform bug (not the security flaw)

gareth rushgrove | morethanseven.net

Page 15: Config managament for development environments iii

On our Mac

gareth rushgrove | morethanseven.net

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

Page 16: Config managament for development environments iii

⚡ ./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 17: Config managament for development environments iii

On Linux

gareth rushgrove | morethanseven.net

$ ./server.rb &$ curl "http://127.0.0.1:8181/?query=Bob"$ curl "http://127.0.0.1:8181/?query=bob"$ ls

Page 18: Config managament for development environments iii

$ ./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 19: Config managament for development environments iii

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

Solutions

Page 20: Config managament for development environments iii

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

Virtualisation

gareth rushgrove | morethanseven.net

Page 21: Config managament for development environments iii

VirtualBox

gareth rushgrove | morethanseven.net

Page 22: Config managament for development environments iii

VMware

gareth rushgrove | morethanseven.net

Page 23: Config managament for development environments iii

Virtualisation needs powerful hardware

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

Page 24: Config managament for development environments iii

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

What about editing code?

Page 25: Config managament for development environments iii

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

Shared Folders or NFS

gareth rushgrove | morethanseven.net

Page 26: Config managament for development environments iii

Doubledown

Page 27: Config managament for development environments iii

Vim

gareth rushgrove | morethanseven.net

Page 28: Config managament for development environments iii

Vagrantup.com

gareth rushgrove | morethanseven.net

Page 29: Config managament for development environments iii

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 30: Config managament for development environments iii

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

Base boxes

gareth rushgrove | morethanseven.net

Page 31: Config managament for development environments iii

VeeWee

gareth rushgrove | morethanseven.net

Page 32: Config managament for development environments iii

gareth rushgrove | morethanseven.net

Community boxes

Page 33: Config managament for development environments iii

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

Vagrant up

gareth rushgrove | morethanseven.net

Page 34: Config managament for development environments iii

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

Vagrant command line

gareth rushgrove | morethanseven.net

Page 35: Config managament for development environments iii

⚡ 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 36: Config managament for development environments iii

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

Vagrantfile

gareth rushgrove | morethanseven.net

Page 37: Config managament for development environments iii

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 38: Config managament for development environments iii

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

Shared folders

gareth rushgrove | morethanseven.net

Page 39: Config managament for development environments iii

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 40: Config managament for development environments iii

Vagrant::Config.run do |config| config.vm.boot_mode = :gui config.ssh.forward_agent = true config.vm.network("33.33.33.10") config.vm.customize do |vm| vm.memory_size = 512 endend

Lots more options

gareth rushgrove | morethanseven.net

Page 41: Config managament for development environments iii

Puppet

gareth rushgrove | morethanseven.net

Page 42: Config managament for development environments iii

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 43: Config managament for development environments iii

Vagrant provisioning with Puppetmaster

gareth rushgrove | morethanseven.net

Vagrant::Config.run do |config| config.vm.provision :puppet_server do |puppet| puppet.puppet_server = "puppet.example.com" puppet.puppet_node = "vm.example.com" endend

Page 44: Config managament for development environments iii

Chef

gareth rushgrove | morethanseven.net

Page 45: Config managament for development environments iii

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 46: Config managament for development environments iii

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 47: Config managament for development environments iii

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 48: Config managament for development environments iii

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 49: Config managament for development environments iii

⚡ vagrant provision[default] Running provisioner: Vagrant::Provisioners::Puppet...[default] Running Puppet with base.pp...[default] notice: /Stage[main]//File[/etc/motd]/content: content changed '{md5}a10cc0046a5fad11470513e5f5df9d91' to '{md5}9e5e449fc643d3e88a2cefeb1af7bc2e'[default] [default] notice: /Stage[main]//File[/etc/motd]/mode: mode changed '777' to '644'

Useful for testing puppet modules

gareth rushgrove | morethanseven.net

Page 50: Config managament for development environments iii

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

Useful for local configuration management

gareth rushgrove | morethanseven.net

Page 51: Config managament for development environments iii

gareth rushgrove | morethanseven.net

Real world example

gareth rushgrove | morethanseven.netgareth rushgrove | morethanseven.net

- I want my development environment on my local vms- I don’t want a wiki page of instructions- I don’t want to have to manually install anything- I don’t want to care about destroying a virtual machine

Page 52: Config managament for development environments iii

⚡ tree├── Vagrantfile└── modules └── garethr ├── manifests │   └── init.pp ├── spec │   └── classes │   └── base.rv │   └── janus.rv │   └── ohmyzsh.rv └────── spec_helper.rb

Puppet layout

gareth rushgrove | morethanseven.net

Page 53: Config managament for development environments iii

Packages I like

gareth rushgrove | morethanseven.net

class base { $packages = ["zsh", "wget", "curl", "lynx", "git-core", "dvtm", “tree”, "build-essential", "vim-nox"] package { $packages: ensure => "installed" }}

Page 54: Config managament for development environments iii

My Zsh configs

gareth rushgrove | morethanseven.net

$repo = "git://github.com/robbyrussell/oh-my-zsh.git"exec { "ohmyzsh": command => "git clone ${repo} .oh-my-zsh", cwd => "/home/vagrant", creates => "/home/vagrant/.oh-my-zsh", require => Class["base"],}exec { "zshrc": command => "cp .... /home/vagrant/.zshrc", creates => "/home/vagrant/.zshrc", require => Exec["ohmyzsh"],}

Page 55: Config managament for development environments iii

My Vim configs

gareth rushgrove | morethanseven.net

$repo = "git://github.com/carlhuda/janus.git"exec { "get_janus": command => "git clone ${repo} .vim", cwd => "/home/vagrant", creates => "/home/vagrant/.vim", require => Class["base"],}exec { "compile_janus": command => "rake", creates => "/home/vagrant/.zshrc", require => Exec["ohmyzsh"], environment => "HOME=/home/vagrant",}

Page 56: Config managament for development environments iii

Testing with Rspec

gareth rushgrove | morethanseven.net

require 'spec_helper'

describe 'ohmyzsh', :type => :class do it { should create_exec("ohmyzsh") } it { should create_exec("zshrc") } it { should create_class("base") }end

Page 57: Config managament for development environments iii

Rspec results

gareth rushgrove | morethanseven.net

base should create Package[zsh] should create Package[vim-nox] should create Package[git-core]

ohmyzsh should create Exec[ohmyzsh] should create Exec[zshrc] should create Class[base]

Finished in 1.4 seconds10 examples, 0 failures

Page 58: Config managament for development environments iii

gareth rushgrove | morethanseven.net

Conclusions

gareth rushgrove | morethanseven.netgareth rushgrove | morethanseven.net

- Using Virtualisation makes getting started fast- Running the same platform catches bugs early- Using Vagrant makes managing virtual machines easy- Writing configuration as code makes it testable

Page 59: Config managament for development environments iii

More information on Vagrant

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 60: Config managament for development environments iii

Questions?

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