$30 off During Our Annual Pro Sale. View Details »

Vagrant to the rescue

Sebastian
February 05, 2015

Vagrant to the rescue

Many developers know the pain of setting up a development machine and share the setup with the team - Putting the same folders in the same place, keeping configurations in sync and managing external dependencies. Vagrant solves this problem by creating a development environment inside a virtual machine and making it easy to share with other developers. Within this talk, I'll take the audience on a trip from a time where everybody would install stuff on localhost until the software starts working to a land where the environment one develops in mirrors the production environment as closely as possible without changing the laptop/pc of the developer. I'll talk about devops and configuration management briefly and show how one can get started with vagrant. After this talk, the audience knows what problems vagrant solves and how to get started.

Sebastian

February 05, 2015
Tweet

More Decks by Sebastian

Other Decks in Programming

Transcript

  1. Vagrant to the rescue
    PHP London February 2015
    @Sgoettschkes
    http://nos.twnsnd.co/image/95830917309

    View Slide

  2. View Slide

  3. “It works on my machine”

    View Slide

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

    View Slide

  5. Enter vagrant

    View Slide

  6. Building blocks
    Configuration
    + Provider
    + Base Boxes
    + Provisioner
    + Plugins
    = Vagrant
    http://pixabay.com/static/uploads/photo/2010/12/10/08/salad-1105_640.jpg

    View Slide

  7. 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 "chef_solo" do |chef|
    chef.add_recipe "main"
    end
    end

    View Slide

  8. Providers

    View Slide

  9. 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

    View Slide

  10. Provisioners

    View Slide

  11. Plugins
    # AWS provider
    $ vagrant plugin install vagrant-aws
    # Boxen provisioner
    $ vagrant plugin install ventriloquist
    # Manage host files
    $ vagrant plugin install vagrant-hostmanager
    # Make screenshots of your VM
    $ vagrant plugin install vagrant-camera
    # … many more!

    View Slide

  12. 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

    View Slide

  13. 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”

    View Slide

  14. http://freehddesktopwallpaper.info/wp-content/uploads/2013/06/Blue-Flowers-hd-Wallpapers.jpg
    Basic workflow

    View Slide

  15. Basic workflow
    $ vagrant init Sgoettschkes/debian7-ansible
    $ vagrant up
    # box is booting
    $ vagrant ssh
    # It’s actually a normal, headless VM!
    $ exit

    View Slide

  16. 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

    View Slide

  17. Basic workflow
    $ git clone [email protected]: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

    View Slide

  18. Basic workflow
    # Co-worker updated Vagrantfile/provisioning files
    $ git pull --rebase
    $ vagrant provision
    # VM is up to date again

    View Slide

  19. 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

    View Slide

  20. Use cases

    View Slide

  21. Use cases
    Development environment

    View Slide

  22. Use cases
    Development environment
    Testing environment

    View Slide

  23. Use cases
    Development environment
    Testing environment
    Local test box for PMs & Designer

    View Slide

  24. Use cases
    Development environment
    Testing environment
    Local test box for PMs & Designer
    Playing around

    View Slide

  25. Use cases
    Development environment
    Testing environment
    Local test box for PMs & Designer
    Playing around
    with clusters

    View Slide

  26. Use cases
    Development environment
    Testing environment
    Local test box for PMs & Designer
    Playing around
    with clusters
    Open Source projects

    View Slide

  27. https://www.dropbox.com/s/mfmusz1qjotilbs/2H.jpg
    Best practices

    View Slide

  28. Base Boxes
    The fewer, the better

    View Slide

  29. Provisioning
    Idempotent

    View Slide

  30. Provisioning
    One step

    View Slide

  31. Provisioning
    # Bad:
    $ vagrant up
    $ install software x
    $ run script y
    $ create z

    View Slide

  32. Provisioning
    # Good:
    $ vagrant up

    View Slide

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

    View Slide

  34. … Performance?

    View Slide

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

    View Slide

  36. Multi-VM setup
    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

    View Slide

  37. Multi-VM setup
    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

    View Slide

  38. Vagrant share
    $ vagrant share
    # Your VM is now accessible through a public url
    # You can go back doing awesome work!

    View Slide

  39. Vagrant push
    config.push.define "ftp" do |push|
    push.dir = "/srv/workspace"
    push.host = "ftp.awesomeCompany.com"
    end

    View Slide

  40. Vagrant push
    config.push.define "local-exec" do |push|
    push.script = "deploy.sh"
    end

    View Slide

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

    View Slide

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

    View Slide