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

Advanced Vagrant Usage with Puppet

Advanced Vagrant Usage with Puppet

This talk was given at PuppetConf 2012. It covers how I use Vagrant with Puppet and how I automate a lot of what I do with Puppet.

Mitchell Hashimoto

September 27, 2012
Tweet

More Decks by Mitchell Hashimoto

Other Decks in Programming

Transcript

  1. Advanced Vagrant
    Usage with Puppet

    View Slide

  2. I’m Mitchell Hashimoto
    Also known as @mitchellh

    View Slide

  3. I made Vagrant.
    Hopefully you use it. I think you’ll like it.
    http://vagrantup.com

    View Slide

  4. I’m an automation freak.
    This talk will show this to be true.

    View Slide

  5. Vagrant Usage
    (Ops Focused)

    View Slide

  6. Benefits we want
    from Vagrant...

    View Slide

  7. “The Cloud”
    but on your machine.

    View Slide

  8. Self service.
    Instant provisioning.
    Cost efficient.
    Elastic.
    Pay per use.
    Paul Strong’s Cloud

    View Slide

  9. - Manifest development,
    both simple and not so simple
    Benefits We Want

    View Slide

  10. - Manifest development,
    both simple and not so simple
    - Repeatability
    Benefits We Want

    View Slide

  11. - Manifest development,
    both simple and not so simple
    - Repeatability
    - Fast feedback
    Benefits We Want

    View Slide

  12. - Manifest development,
    both simple and not so simple
    - Repeatability
    - Fast feedback
    - Confidence
    Benefits We Want

    View Slide

  13. Confession: I’ve been
    doing Puppet full time for
    awhile now.

    View Slide

  14. Current state of
    Vagrant + Puppet...

    View Slide

  15. Basic manifest
    development and testing.

    View Slide

  16. ... Yep.

    View Slide

  17. We can do better.
    We can do much better.

    View Slide

  18. We can do better with
    what is available right now.

    View Slide

  19. Teaser: We will do magic with
    what is coming in the future.
    <3 <3 <3

    View Slide

  20. My state of
    Vagrant + Puppet...

    View Slide

  21. Fully automated
    Puppet Master setup.

    View Slide

  22. Testing exported
    resources, hiera, and nodes.

    View Slide

  23. Common deploy process
    across Vagrant and EC2.

    View Slide

  24. Repeatable workflow of
    dev to staging to prod.

    View Slide

  25. Golden master box
    creation for development.

    View Slide

  26. Time to share
    what I’ve learned.

    View Slide

  27. Advanced
    Vagrant Usage

    View Slide

  28. Advanced
    Vagrant Usage

    View Slide

  29. Advanced
    Automation for Puppet Work

    View Slide

  30. Fully Automated
    Puppet Master Setup

    View Slide

  31. I asked: “How do people
    bring up or recover a
    Puppet master?”

    View Slide

  32. “Most people roll their
    Puppet Master by hand.”
    - Anonymous PuppetLabs Employee

    View Slide

  33. View Slide

  34. Puppet Master is crucial to
    testing realistic scenarios.

    View Slide

  35. Automated Puppet Master
    - Pushing broken Puppet
    crashes the server.

    View Slide

  36. Automated Puppet Master
    - Pushing broken Puppet
    crashes the server.
    - Local development against a
    Puppet Master has benefits.

    View Slide

  37. Automated Puppet Master
    - Pushing broken Puppet
    crashes the server.
    - Local development against a
    Puppet Master has benefits.
    - Automation all the way down.

    View Slide

  38. Multi-level bootstrap.

    View Slide

  39. 1. Bash script to minimally
    install Puppet master and
    agent.

    View Slide

  40. 2. puppet apply to
    minimally setup Puppet
    Master infrastructure

    View Slide

  41. 3. puppet agent to
    completely setup and
    harden the master.

    View Slide

  42. Result: Production-quality
    Puppet Master whenever
    you need it.

    View Slide

  43. Vagrant::Config.run do |config|
    # ...
    config.vm.hostname = "puppet"
    config.vm.provision :shell, :path =>
    "bootstrap.sh"
    end

    View Slide

  44. Testing
    Exported Resources,
    Hiera, and nodes.

    View Slide

  45. I asked: “How do people
    test more than the most
    basic Puppet module?”

    View Slide

  46. “I suspect the answer is
    that they just don't test
    their modules adequately.”
    - Anonymous PuppetLabs Employee

    View Slide

  47. View Slide

  48. Solution: Automated
    Puppet Master + Multi-VM

    View Slide

  49. Automated Puppet Master
    is production ready:
    PuppetDB, Hiera, etc.

    View Slide

  50. Multi-VM enables Vagrant
    to manage a cluster of
    machines that can
    communicate.
    http://vagrantup.com/v1/docs/multivm.html

    View Slide

  51. Testing Exported Resources

    View Slide

  52. Create two nodes.
    Export one.
    Collect other.
    Ruby/Shell script.
    Testing Exported Resources

    View Slide

  53. node 'test_exporter' {
    @@nginx::site { "test":
    content => "\n",
    tag => "origin",
    }
    }
    node 'test_collector' {
    include role::origin
    }

    View Slide

  54. Vagrant::Config.run do |config|
    config.vm.define :export do |n|
    n.vm.hostname = "test_exporter"
    n.vm.provision :puppet_server,
    :options => "--verbose --debug"
    end
    config.vm.define :collect do |n|
    n.vm.hostname = "test_collecter"
    n.vm.provision :puppet_server,
    :options => "--verbose --debug"
    end
    end

    View Slide

  55. #!/bin/bash
    test -f /etc/nginx/sites-available/test

    View Slide

  56. Testing Hiera

    View Slide

  57. Create full Hiera hierarchy.
    Launch node.
    Test hierarchy.

    View Slide

  58. ---
    test_region: "us-east-1"
    ---
    test_role: "hiera"
    ---
    test_name: "test-hiera”

    View Slide

  59. Vagrant::Config.run do |config|
    config.vm.hostname = "test_hiera"
    config.vm.provision :puppet_server,
    :options => "--verbose --debug"
    end
    end

    View Slide

  60. node 'test_hiera' {
    $region = hiera("test_region")
    $role = hiera("test_role")
    $name = hiera("test_name")
    file { "/tmp/results":
    content => "$region $role $name",
    mode => "0644",
    }
    }

    View Slide

  61. Testing Nodes

    View Slide

  62. Create node.
    Provision.
    Test behavior.

    View Slide

  63. Vagrant::Config.run do |config|
    config.vm.define :master do |master|
    master.vm.hostname = "puppet"
    master.vm.provision :shell, :path =>
    "bootstrap.sh"
    end
    config.vm.define :node do |node|
    node.vm.hostname = "postgresql"
    node.vm.provision :puppet_server,
    :options => "--verbose --debug"
    end
    end

    View Slide

  64. Pain points: Node
    destroy/up requires cert
    clean on master plus a
    PuppetDB deactivate.

    View Slide

  65. Common Deploy
    Process Across
    Vagrant and EC2

    View Slide

  66. Getting your Puppet code
    to your masters. Solved?

    View Slide

  67. Goal: Make it the same for
    Vagrant, production, and
    anything in between.

    View Slide

  68. My solution: Bash script
    to git pull, rsync, and
    restart the master.

    View Slide

  69. fab deploy:vagrant
    fab deploy:production
    fab deploy:dev-mitchellh
    http://fabfile.org

    View Slide

  70. @task
    def deploy(environment):
    # ...
    run("sudo /opt/puppet-updater/update")

    View Slide

  71. - Git pull
    - Find env-* branches for
    environments.
    - RSync
    - Restart Puppet Master
    http://bit.ly/Qyg3RW
    Updater Script

    View Slide

  72. Note: I don’t use Puppet
    environments for dev
    because I like to keep
    production master just for
    production.

    View Slide

  73. (Plus, the automated
    Puppet Master setup is
    just so easy!)

    View Slide

  74. Repeatable Workflow
    From Dev to Staging
    to Production

    View Slide

  75. Dev is in VirtualBox.
    Staging is in EC2.
    Production is in EC2.

    View Slide

  76. Goal: Same workflow.

    View Slide

  77. rake launch:vagrant,postgresql
    rake destroy:production,riak-001
    rake provision:staging,haproxy-002

    View Slide

  78. Wrapper around vagrant
    and AWS library.

    View Slide

  79. Hides some cruft: destroy
    will cert clean and
    deactivate from
    PuppetDB, for example.

    View Slide

  80. Golden Master Box
    Creation for
    Development

    View Slide

  81. vagrant up a complete
    dev environment can be
    slow.

    View Slide

  82. Take advantage of
    Puppet’s idempotence
    and vagrant package

    View Slide

  83. Two-pass Puppet run
    for development.

    View Slide

  84. Pass 1 (pre-package):
    Installation and
    configuration.

    View Slide

  85. Pass 2 (vagrant up):
    Service starting and
    maybe configuration.

    View Slide

  86. vagrant package takes
    current Vagrant VM and
    produces a distributable
    box.

    View Slide

  87. Build discipline around
    updating the base box.

    View Slide

  88. Example: Work on any
    box you want, update to
    latest base box prior to
    committing.

    View Slide

  89. Bonus points:
    Put this in a CI.

    View Slide

  90. Automate
    All the things

    View Slide

  91. THANKS!
    @mitchellh

    View Slide