Creating a Development Environment w/ Vagrant
I don't want to read any of this right now. Show me the good stuff.
bundle install rake vagrant:basebox:build:all rake vagrant:add[stevo] rake vagrant:up[stevo] rake vagrant:ssh[stevo]
What is this vagrant stuff?
This document will detail the steps necessary to create a development environment with VirtualBox and Puppet. The bootstrap will be customized to your machine/environment (ruby/virtualbox/etc), but the internals of the test machine will be uniform across developers, allowing for quick and consistent development
- VirtualBox (4.0.x or higher)
- ruby (1.9.2 or higher)
- Download VirtualBox (you're using Boxen, right?)
- Install the Gems
bundle install3. Build some baseboxes
rake vagrant:basebox:build:all4. Edit config/nodes.yaml 5. `rake vagrant:up`
A buildbox must be created. For this, we will use veewee. Veewee is an application designed to simulate a PXE boot environment, replicating provisioning tools including kickstart/FAI to programatically build a bare basebox for usage.
New definitions can be established using the following commands:
vagrant basebox templates vagrant basebox define <template name> <box>
New defined boxes will automatically be added to the Rake Task to be
built individually or bundled as part of the
Nodes are managed via the ./config/nodes.yml file. By default, this file is automatically populated with the data contained in ./config/autogen_defaults.yml in the event this file does not exist.
Thie file is responsible for managing all of the various defined nodes that Vagrant is aware of via vagrant-hitch. Likewise, this file also generates a faux-DNS for the puppetmaster via /etc/hosts.
This file is automatically initialized upon calling the rake task
vagrant:puppetmaster:up if it does not exist. This seeds the
./config/nodes.yml file to contain a standard default set as well as a
Puppet Master definition in order to boot.
This action is non-destructive
In the event that you wish to reset your current node configuration,
simply execute the
vagrant:node:reset rake task. This will
destructivly re-initialize the
Adding a Node
All of the current node configurations that Vagrant is aware about is
currently stored in
config/nodes.yml. Each node inherits defaults from
the respective provisioner configuration located in
Each of the necessary tasks in order to add a a single nodes have been converted into a rake task
The following example will add a new node with defaults from the
'defaults' block in
Optionally, you can provide an alternate Vagrant Box definition to add:
Remove a node
To remove a node, simply execute the following command:
nodes.yml is automatically generated by the various rake tasks
associated with the vagrant environment. The generated YAML can be
edited to further customize a node as necessary.
vbox: vagrant vbox name vbox_url: http location of where a pre-compiled box is stored orgname: DNS Domain name for an organization winrm: username: winrm username password: winrm password timeout: winrm timeout memory_size: Allocated RAM (MB) for guest cpu_count: Allocated CPU for guest network: host only network IP ports: <name>: guest: port to forward to host host: port to bind on host mounts: <name>: guest: location on guest where filesystem is mapped host: location on the host where filesystem is mapped from puppet: Puppet Solo Provisioner modules: path to module storage manifests_path: full path to manifest file manifests_file: file loaded from $manifests_path node_config: options passed to puppet [array of values] puppet_server: Puppet Server Provisioner puppet_server: location of puppet server puppet_node: Certificate name passed to puppet server from node node_config: options passed to puppet [array of values] chef: Chef Solo Provsioner log_level: logging level for chef-solo cookbooks_path: path to cookbooks [array] roles_path: path to location of role defintions data_bags_path: path to databag storage roles: List of arrays to assign to a node [array]
All nodes for testing must have an IP address associated with it that is
in the same /24 subnet as the PuppetMaster. (set by default to
192.168.200.2). Vagrant is utilizing host-only networking for this
This is automatically generated based on the IP set in the &default block of nodes.yml.
Examples of Vagrant-Hitch usage and adding to config can be found here: (https://github.com/fup/vagrant-hitch/tree/master/example/config)
In order to simulate as many portions of existing code as possible (including Exported Resources), all of the Vagrant commands have been wrapped in their respective rake tasks. These tasks ensure that the local PuppetMaster is up and running, and that any stale SSL certificates on the part of the PuppetMaster.
All pre-requisite vagrant commands also automatically generate the modules.pp file required for inclusion by the PuppetMaster.
rake puppet:generate:modules # Generate modules.pp while refactoring for autoloading rake vagrant:basebox:build:all # Build all available Baseboxes rake vagrant:basebox:build:debian-5.0.10-amd64 # Builds debian-5.0.10-amd64 Vagrant Basebox rake vagrant:basebox:build:debian-6.0.6-amd64 # Builds debian-6.0.6-amd64 Vagrant Basebox rake vagrant:basebox:build:lenny # Build latest Debian Lenny Basebox rake vagrant:basebox:build:squeeze # Build latest Debian Squeeze Basebox rake vagrant:basebox:list:all # List all of the available basebox definitions rake vagrant:destroy[name] # Forcefully destroy vagrant node [<node>] rake vagrant:node:add[name,vbox] # Add node [<node>] to nodes.yml with [<vbox> (default from &default)] rake vagrant:node:initialize # Initialize a base nodes.yml rake vagrant:node:remove[name] # Remove node [<node>] from nodes.yml rake vagrant:node:reset # Force reset nodes.yml rake vagrant:provision[name] # Provision vagrant node [<host>] and ensure PuppetMaster is ready rake vagrant:puppetmaster:certs:delete[name] # Delete all certificates with [<host>] rake vagrant:puppetmaster:destroy # Forcefully destroy the Puppetmaster rake vagrant:puppetmaster:rebuild # Destroy and rebuild the Puppetmaster (destructive) rake vagrant:puppetmaster:reload # Restart the Puppetmaster (non-destructive) rake vagrant:puppetmaster:up # Turn on the Puppetmaster rake vagrant:rebuild[name] # Destroy and rebuild vagrant node [<host>] (destructive) rake vagrant:reload[name] # Restart vagrant node [<host>] rake vagrant:ssh[name] # SSH into a host [<name>] rake vagrant:up[name] # Turn on vagrant node [<host>] and ensure PuppetMaster is ready
- Lenny 5.0 does not have libaugeas-ruby for augeas support. Need to find appropriate way to add.
- Need to add ability for loading templates into nodes.yml