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

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. 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
  4. • 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?
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. • IT automation software • Language inspired by Nagios •

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

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

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

    "link", target => "/etc/apache2/mods-available/actions.conf" } 29
  15. 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
  16. Ordering & chaining • No loading order • before and

    require • notify and subscribe • arrow chaining ( -> to require and ~> to notify) 32
  17. 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
  18. 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
  19. 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
  20. Ordering & chaining • No loading order • before and

    require • notify and subscribe • arrow chaining ( -> to require and ~> to notify) 40
  21. 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
  22. 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
  23. 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
  24. 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
  25. PuPHPet A simple GUI to set up virtual machines for

    PHP Web development. 47 https://puphpet.com/ https://github.com/puphpet/puphpet
  26. 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