Vagrant and Ansible: A love story

Db6218c1b56d64e775eb79ea4f2889dd?s=47 Sebastian
February 05, 2015

Vagrant and Ansible: A love story

My talk "vagrant + ansible: A love story" will introduce the audience not yet familiar with vagrant to this wonderfull tool which aims at "Create[ing] and configur[ing] lightweight, reproducible, and portable development environments". This will include a short overview over the architecture of vagrant and the different use cases. Two different ways of using ansible with vagrant will be discussed together with pro's and con's of both. Best practices of working withvagrant and ansible will be described.

Db6218c1b56d64e775eb79ea4f2889dd?s=128

Sebastian

February 05, 2015
Tweet

Transcript

  1. Ansible and Vagrant A love story AnsibleFest London, 2015 http://pixabay.com/get/f72f42c0c92d9ee12bc3/1422473642/cloud-600224_1920.jpg

    @Sgoettschkes
  2. http://pixabay.com/get/5c603ff58720250803c9/1422648022/forest-438432_1280.jpg

  3. http://pixabay.com/get/3489448873097c5aa562/1422648090/apple-195628_1280.jpg

  4. “It works on my machine”

  5. “It’s all in SETUP.md”

  6. Enter vagrant

  7. Building blocks Configuration + Provider + Base Boxes + Provisioner

    + Plugins = Vagrant http://pixabay.com/static/uploads/photo/2010/12/10/08/salad-1105_640.jpg
  8. Configuration Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7-ansible" config.vm.network "private_network", ip:

    "127.0.0.101" config.vm.synced_folder "../", "/srv/workspace" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  9. Providers

  10. Base Boxes Base Boxes • Image from VM • Provider-specific

    • Distribution through ◦ HTTP ◦ “Atlas” http://upload.wikimedia.org/wikipedia/commons/9/91/Shipping_containers_at_Clyde.jpg
  11. Provisioners

  12. Provisioners

  13. Plugins # AWS provider $ vagrant plugin install vagrant-aws #

    Boxen provisioner $ vagrant plugin install ventriloquist # Executing on the host $ vagrant plugin install vagrant-hostmanager # Executing on the guest $ vagrant plugin install vagrant-camera
  14. Synced folders http://upload.wikimedia.org/wikipedia/commons/5/5d/BalticServers_data_center.jpg # Vagrantfile config.vm.synced_folder "~/local/path/to/project", # on host

    "/opt/project" # on guest
  15. SSH http://pixabay.com/static/uploads/photo/2013/04/08/22/48/tunnel-101976_640.jpg $ vagrant ssh # or $ ssh -p

    2222 vagrant@localhost # with password “vagrant”
  16. Example $ tree . |-- .git |-- .vagrant |-- playbook.yml

    |-- Vagrantfile
  17. Example $ cat Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7-ansible"

    config.vm.network "private_network", ip: "127.0.0.101" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  18. Example $ cat Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7-ansible"

    config.vm.network "private_network", ip: "127.0.0.101" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  19. Example $ cat Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7-ansible"

    config.vm.network "private_network", ip: "127.0.0.101" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  20. Example $ cat Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7-ansible"

    config.vm.network "private_network", ip: "127.0.0.101" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end end
  21. Example $ cat playbook.yml --- hosts: all tasks: - name:

    update apt apt: update_cache=yes - name: install git apt: pkg=git state=latest
  22. More dependencies, anyone? https://www.dropbox.com/s/xdeyi95buvofdxy/169H.jpg

  23. Better example $ tree . |-- .git |-- .vagrant |--

    hosts |-- playbook.yml |-- Vagrantfile
  24. Better example $ tree . |-- .git |-- .vagrant |--

    hosts |-- playbook.yml |-- Vagrantfile
  25. Better example $ cat hosts localhost ansible_connection=local

  26. Better example Vagrant.configure(2) do |config| # ... config.vm.provision "shell", inline:

    "cp /vagrant/hosts /etc/ansible/hosts" if Vagrant.has_plugin?("vagrant-ansible-local”) config.vm.provision "ansibleLocal", playbook: "playbook.yml" else config.vm.provision "shell", inline: "ansible-playbook /vagrant/playbook.yml" end
  27. Better example Vagrant.configure(2) do |config| # ... config.vm.provision "shell", inline:

    "cp /vagrant/hosts /etc/ansible/hosts" if Vagrant.has_plugin?("vagrant-ansible-local”) config.vm.provision "ansibleLocal", playbook: "playbook.yml" else config.vm.provision "shell", inline: "ansible-playbook /vagrant/playbook.yml" end
  28. Better example Vagrant.configure(2) do |config| # ... config.vm.provision "shell", inline:

    "cp /vagrant/hosts /etc/ansible/hosts" if Vagrant.has_plugin?("vagrant-ansible-local”) config.vm.provision "ansibleLocal", playbook: "playbook.yml" else config.vm.provision "shell", inline: "ansible-playbook /vagrant/playbook.yml" end
  29. Better example Vagrant.configure(2) do |config| # ... config.vm.provision "shell", inline:

    "cp /vagrant/hosts /etc/ansible/hosts" if Vagrant.has_plugin?("vagrant-ansible-local”) config.vm.provision "ansibleLocal", playbook: "playbook.yml" else config.vm.provision "shell", inline: "ansible-playbook /vagrant/playbook.yml" end
  30. http://freehddesktopwallpaper.info/wp-content/uploads/2013/06/Blue-Flowers-hd-Wallpapers.jpg Basic workflow

  31. Basic workflow $ vagrant init Sgoettschkes/debian7-ansible $ vagrant up #

    box is booting $ vagrant ssh # It’s actually a normal, headless VM! $ exit
  32. Basic workflow $ vim Vagrantfile # change config # add

    provisioners and so on $ git init $ git commit -Am ‘I am using Vagrant now!’ # Keep the Vagrantfile and files needed for provisioning # in git (or any other scm) to share with others
  33. Basic workflow $ git clone git@github.com:awesomecompany/awesomeVm.git $ cd awesomeVm &&

    vagrant up # VM is setup the same as on your co-workers machine # You can now work on your project
  34. Basic workflow # Co-worker updated Vagrantfile/provisioning files $ git pull

    --rebase $ vagrant provision # VM is up to date again
  35. Basic workflow # You wanna change some Vagrant related stuff

    $ vim Vagrantfile # Change it! $ vim playbook.yml # Change something here as well, maybe? $ vagrant provision # Your box is up to date again $ git commit -am ‘Incredible changes’ && git push
  36. http://www.gratisography.com/pictures/114_1.jpg Playbook testing?

  37. Testing playbooks Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7" config.vm.define "web1"

    do |web1| web1.vm.network "private_network", ip: "192.168.1.150" end config.vm.define "db1" do |db1| db.vm.network "private_network", ip: "192.168.1.151" end end
  38. Testing playbooks Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7" config.vm.define "web1"

    do |web1| web1.vm.network "private_network", ip: "192.168.1.150" end config.vm.define "db1" do |db1| db.vm.network "private_network", ip: "192.168.1.151" end end
  39. Testing playbooks Vagrant.configure(2) do |config| config.vm.box = "Sgoettschkes/debian7" config.vm.define "web1"

    do |web1| web1.vm.network "private_network", ip: "192.168.1.150" end config.vm.define "db1" do |db1| db.vm.network "private_network", ip: "192.168.1.151" end end
  40. Testing playbooks $ cat testing [webservers] 192.168.1.150 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key [dbservers]

    192.168.1.151 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key
  41. Testing playbooks $ cat testing [webservers] 192.168.1.150 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key [dbservers]

    192.168.1.151 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key
  42. Testing playbooks $ cat testing [webservers] 192.168.1.150 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key [dbservers]

    192.168.1.151 ansible_ssh_user=vagrant ansible_ssh_private_key=path/to/key
  43. Testing playbooks $ vagrant destroy --force && vagrant up #

    Now you have freshly setup machines # Run your playbooks like you would for staging/production $ ansible-playbook -i testing site.yml # Maybe run a testscript $ ./test_setup.sh
  44. https://www.dropbox.com/s/mfmusz1qjotilbs/2H.jpg Best practices

  45. Base Boxes The fewer, the better

  46. Provisioning Idempotent

  47. Provisioning One step

  48. Provisioning # Bad: $ vagrant up $ install software x

    $ run script y $ create z
  49. Provisioning # Good: $ vagrant up

  50. Vms per Developer The fewer, the better (again)

  51. http://nos.twnsnd.co/image/108652898544 What else is there?

  52. Vagrant share $ vagrant share # Your VM is now

    accessible through a public url # You can go back doing awesome work!
  53. Vagrant push config.push.define "ftp" do |push| push.dir = "/srv/workspace" push.host

    = "ftp.awesomeCompany.com" end
  54. Vagrant push config.push.define "local-exec" do |push| push.script = "deploy.sh" end

  55. Vagrant “Development environments made easy” http://fc02.deviantart.net/fs50/i/2009/315/4/c/Tweaked_toy_airplane_by_afd.jpg

  56. https://www.dropbox.com/s/6z5aiwa8l09g2pa/86H.jpg