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

    View Slide

  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

    View Slide

  3. @_dcsg
    Me on internet
    3
    dcsg
    danielcsgomes.com

    View Slide

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

    View Slide

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

    View Slide

  6. Goals
    • Understand Vagrant and Puppet
    • Setup a dev environment
    6

    View Slide

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

    View Slide

  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

    View Slide

  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?

    View Slide

  10. 10
    example of
    a Vagrantfile

    View Slide

  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

    View Slide

  12. 12
    $ cd /path/to/my/project
    !
    $ vagrant up
    !
    $ vagrant ssh
    Running it

    View Slide

  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

    View Slide

  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

    View Slide

  15. Multi Machines
    Ability to replicate your system's architecture
    http://docs.vagrantup.com/v2/multi-machine/index.html
    15

    View Slide

  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

    View Slide

  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

    View Slide

  18. Debugging
    !
    $ set VAGRANT_LOG=debug
    $ vagrant up
    ...
    http://docs.vagrantup.com/v2/debugging.html
    18

    View Slide

  19. Providers
    19

    View Slide

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

    View Slide

  21. Customize the Provider
    21

    View Slide

  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

    View Slide

  23. Provision
    23

    View Slide

  24. 24
    Shell scripts

    View Slide

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

    View Slide

  26. • IT automation software
    • Language inspired by Nagios
    • Declarative language
    26
    What is Puppet?

    View Slide

  27. Basic concepts
    • Resources types
    • Classes, modules, templates
    • Variables, Facts and Conditionals
    • Ordering and chaining
    27

    View Slide

  28. Built-in Resources Types
    • File
    • Exec
    • Package
    • Cron
    • Host
    • Service
    • ….
    28

    View Slide

  29. File example
    file { "mod_actions_conf":
    path => "/etc/apache2/mods-enabled/actions.conf",
    ensure => "link",
    target => "/etc/apache2/mods-available/actions.conf"
    }
    29

    View Slide

  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

    View Slide

  31. Class example
    class my_class {
    notify {"This actually did something":}
    }
    !
    include my_class
    31

    View Slide

  32. Ordering & chaining
    • No loading order
    • before and require
    • notify and subscribe
    • arrow chaining ( -> to require and ~> to notify)
    32

    View Slide

  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

    View Slide

  34. http://www.ansible.com/home
    http://docs.ansible.com/
    34

    View Slide

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

    View Slide

  36. Basic concepts
    • Inventory
    • Playbook
    • Tasks
    • Roles
    • Handlers
    • Modules
    36

    View Slide

  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

    View Slide

  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

    View Slide

  39. Class example
    class my_class {
    notify {"This actually did something":}
    }
    !
    include my_class
    39

    View Slide

  40. Ordering & chaining
    • No loading order
    • before and require
    • notify and subscribe
    • arrow chaining ( -> to require and ~> to notify)
    40

    View Slide

  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

    View Slide

  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

    View Slide

  43. let’s get started
    43

    View Slide

  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

    View Slide

  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

    View Slide

  46. Librarian Puppet
    • Helps manage the modules
    • https://github.com/rodjek/librarian-puppet
    46

    View Slide

  47. PuPHPet
    A simple GUI to set up virtual
    machines for PHP Web
    development.
    47
    https://puphpet.com/
    https://github.com/puphpet/puphpet

    View Slide

  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

    View Slide

  49. @danielcsgomes | [email protected] | http://danielcsgomes.com
    Jian Awe © http://www.flickr.com/photos/qqjawe/6511141237
    Questions?
    https://joind.in/9281
    rate & feedback
    49

    View Slide