Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Build and share dev environments with Vagrant & Puppet at @ISEL

Build and share dev environments with Vagrant & Puppet at @ISEL

0fe2d959c89cf2d9de497a237c4ea99d?s=128

Daniel Gomes

May 27, 2014
Tweet

More Decks by Daniel Gomes

Other Decks in Technology

Transcript

  1. Build & Share Vagrant & Puppet development environments with Daniel

    Gomes @_dcsg 7 de Abril de 2014 Seminário
  2. Who am I • Software Engineer @ UniPlaces • Co-founder

    & organizer @ phplx • Co-organizer @ SymfonyDay Portugal • ZCE PHP 5.3, CSM, OCP MySQL 5 Developer 2
  3. @_dcsg Me on internet 3 dcsg danielcsgomes.com

  4. Requirements • Vagrant 1.5.x • VirtualBox 4.3 • Git 4

  5. Agenda • Introduction to Vagrant • Introduction to puppet •

    Hands on 5
  6. Goals • Understand Vagrant and Puppet • Setup a dev

    environment 6
  7. http://www.vagrantup.com/ 7

  8. va•grant (ˈveɪ grənt) Noun: ! a person without a settled

    home or regular work who wanders from place to place and lives by begging 8
  9. • Manage virtual machines (such as Virtual Box, VMware, AWS,

    and others) • Define the configuration in code with a single file • Provision the VM with Shell scripts, Puppet, Ansible, Chef and other tools 9 What is Vagrant?
  10. 10 example of a Vagrantfile

  11. 11 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! # define

    base box config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" ! # port forwarding config.vm.network :forwarded_port, guest: 80, host: 8080 ! # setup a private network with a static IP Address config.vm.network :private_network, ip: "10.5.0.2" ! # sharing folders config.vm.synced_folder ".", "/vagrant" ! end
  12. 12 $ cd /path/to/my/project ! $ vagrant up ! $

    vagrant ssh Running it
  13. Workflow of vagrant up Vagrantfile Provision manifest has provisioning manifest

    and it’s first time? yes start provisioning the VM VM is running vagrant up downloads the box if needed, loads the vagrant configuration (share folders, port forwarding, etc) and starts the VM 13
  14. vagrant init vagrant up vagrant halt vagrant reload vagrant provision

    vagrant package vagrant plugin vagrant ssh vagrant ssh-config vagrant suspend vagrant resume vagrant destroy vagrant commands 14
  15. Multi Machines Ability to replicate your system's architecture http://docs.vagrantup.com/v2/multi-machine/index.html 15

  16. 16 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! config.vm.define "web"

    do |web| web.vm.box = "apache" # ... end ! config.vm.define "db" do |db| db.vm.box = "mysql" # ... end ! end
  17. Plugins https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins vagrant plugin install vagrant-example-plugin vagrant plugin list vagrant

    plugin uninstall vagrant-example-plugin Installing a plugin Uninstalling a plugin Listing installed plugin 17
  18. Debugging ! $ set VAGRANT_LOG=debug $ vagrant up ... http://docs.vagrantup.com/v2/debugging.html

    18
  19. Providers 19

  20. and others… https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#providers 20

  21. Customize the Provider 21

  22. 22 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! config.vm.provider :virtualbox

    do |vb| vb.customize [ "modifyvm", :id, '--chipset', 'ich9', '--natdnshostresolver1', 'on', '--memory', 1024 ] end ! end
  23. Provision 23

  24. 24 Shell scripts

  25. http://puppetlabs.com/ http://docs.puppetlabs.com/references/latest/type.html 25

  26. • IT automation software • Language inspired by Nagios •

    Declarative language 26 What is Puppet?
  27. Basic concepts • Resources types • Classes, modules, templates •

    Variables, Facts and Conditionals • Ordering and chaining 27
  28. Built-in Resources Types • File • Exec • Package •

    Cron • Host • Service • …. 28
  29. File example file { "mod_actions_conf": path => "/etc/apache2/mods-enabled/actions.conf", ensure =>

    "link", target => "/etc/apache2/mods-available/actions.conf" } 29
  30. Classes • Named blocks • Defining a class does not

    evaluate the code • Declaring evaluates the code (include) 30 Modules • module name == folder name • specific folder structure
  31. Class example class my_class { notify {"This actually did something":}

    } ! include my_class 31
  32. Ordering & chaining • No loading order • before and

    require • notify and subscribe • arrow chaining ( -> to require and ~> to notify) 32
  33. Ordering example class apt { exec { "apt-update": unless =>

    "test -f /home/vagrant/.apt-update", command => "apt-get update -y", path => ["/bin", "/usr/bin"], notify => File["/home/vagrant/.apt-update"], } ! file { "/home/vagrant/.apt-update": ensure => file, force => true } } 33
  34. http://www.ansible.com/home http://docs.ansible.com/ 34

  35. • IT natural automation language • Agentless 35 What is

    Ansible?
  36. Basic concepts • Inventory • Playbook • Tasks • Roles

    • Handlers • Modules 36
  37. File example - name: Install custom repo yum: name=http://mirror.webtatic.com/yum/el6/latest.rpm state=present

    sudo: yes ! - name: Install common packages yum: name={{ item }} state=present sudo: yes with_items: - htop - vim 37
  38. Inventory 38 Modules • module name == folder name •

    specific folder structure # /path/to/hosts [vagrant] 10.0.30.5 host1 ansible_ssh_port=5555 ansible_ssh_host=10.0.30.5
  39. Class example class my_class { notify {"This actually did something":}

    } ! include my_class 39
  40. Ordering & chaining • No loading order • before and

    require • notify and subscribe • arrow chaining ( -> to require and ~> to notify) 40
  41. Ordering example class apt { exec { "apt-update": unless =>

    "test -f /home/vagrant/.apt-update", command => "apt-get update -y", path => ["/bin", "/usr/bin"], notify => File["/home/vagrant/.apt-update"], } ! file { "/home/vagrant/.apt-update": ensure => file, force => true } } 41
  42. What are we going to build? ! • Provider: Virtual

    box 4.3 • OS: Ubuntu 12.04 x64 ! • PHP 5.4 • Apache 2.2 • MySQL 5.5 42
  43. let’s get started 43

  44. Distributing and sharing • Use (D)VCS (Git, SVN, Mercurial, etc.)

    ! • Add the Vagrantfile and provisioning files (puppet, chef, shell scripts, etc) to your repository ! • Add .vagrant folder to your repository ignore file or your global ignore file. 44
  45. Tips and Tricks • When working in multiple projects use

    port forwarding and networks carefully • Avoid port collision by adding auto_correct: true for each port forwarding • Use --debug on your provision options when something is wrong • Have guest additions always up to date • Improve share folders performance by enabling nfs (is not available on windows) • If you are using Puppet modules, don't forget to add the module dependencies as well 45
  46. Librarian Puppet • Helps manage the modules • https://github.com/rodjek/librarian-puppet 46

  47. PuPHPet A simple GUI to set up virtual machines for

    PHP Web development. 47 https://puphpet.com/ https://github.com/puphpet/puphpet
  48. Resources • Documentation • Vagrant - http://docs.vagrantup.com/v2/ • Puppet -

    http://docs.puppetlabs.com/references/latest/type.html • Learning Puppet - http://docs.puppetlabs.com/learning/index.html • Chef - http://docs.opscode.com/chef/index.html • Ansible - http://ansible.cc/docs/ • Vewee - https://github.com/jedi4ever/veewee • Packer - http://www.packer.io/ ! • Downloads • Vagrant - http://downloads.vagrantup.com/ • Virtual Box - https://www.virtualbox.org/wiki/Downloads • VMware - http://www.vmware.com/products/player/ ! • Source code of the talk demos - http://goo.gl/vWt3Sa • List of base boxes - http://www.vagrantbox.es/ 48
  49. @danielcsgomes | me@danielcsgomes.com | http://danielcsgomes.com Jian Awe © http://www.flickr.com/photos/qqjawe/6511141237 Questions?

    https://joind.in/9281 rate & feedback 49