Provisioning docs

This commit is contained in:
Mitchell Hashimoto 2010-03-03 00:44:59 -08:00
parent 5ce88dcb8c
commit a32bfd430b
1 changed files with 114 additions and 0 deletions

View File

@ -0,0 +1,114 @@
---
layout: getting_started
title: Getting Started - Provisioning
---
# Provisioning
Boxes aren't always going to be one-step setups for your Vagrant environment.
Often times boxes will be used as a base for a more complicated setup. For
example: Perhaps you're creating a rails application which also uses AMQP and
some custom background worker daemons. In this situation, it would be easiest
to use the rails box, but then add the custom software on top of it (and
perhaps even packaging it later so others can make use of it).
Luckily, Vagrant comes with provisioning built right into the software by
using [chef](http://www.opscode.com/chef).
For our basic rails app, we're going to use provisioning for a different
purpose: installing some basic system monitoring tools, specifically [htop](http://htop.sourceforge.net/).
The getting started guide doesn't cover more advanced cookbooks for the purpose of keeping things
simple, but anything is possible with chef.
## Creating the `htop` Cookbook
First things first, we're going to create a directory to store our cookbooks
and then we're going to create the directories for the `htop` cookbook.
{% highlight bash %}
$ mkdir -p cookbooks/htop/recipes
{% endhighlight %}
**Note:** Generally, cookbooks are created with Rake commands using the Rakefile
provided by the Opscode cookbooks repository. Since what we're doing here is so
simple, we're not using this, but most projects typically do.
In the recipes directory of the `htop` cookbook, create a file named `default.rb`
with the following contents. This file defines how chef installs `htop`. The file
should be at `cookbooks/htop/recipes/default.rb`.
{% highlight ruby %}
# Install the htop package via the packaging system
package "htop" do
action :install
end
{% endhighlight %}
## Creating the `vagrant_main` Cookbook
Vagrant uses `vagrant_main` as the entry-point cookbook for chef. This is
analogous to a C program calling `int main` to start a program. The actual
contents of the `vagrant_main` recipe should be to simply include other recipes
in the order you want them ran. First, we'll setup the directory for this cookbook:
{% highlight bash %}
$ mkdir -p cookbooks/vagrant_main/recipes
{% endhighlight %}
And then the contents of the `default.rb` file:
{% highlight ruby %}
# Just install htop
require_recipe "htop"
{% endhighlight %}
**Note:** The fact that Vagrant calls `vagrant_main` as the main cookbook is
configurable using the Vagrantfile, but we won't modify it in this getting
started guide.
## Enabling Provisioning
With everything is now in place, the final step is to modify the Vagrantfile
to point to our cookbooks directory and to enable provisioning. Add the
following contents to the project's Vagrantfile:
{% highlight ruby %}
Vagrant::Config.run do |config|
config.chef.enabled = true
# This directory is expanded relative to the project directory.
config.chef.cookbooks_path = "cookbooks"
end
{% endhighlight %}
**Note:** If you're feeling lazy, you can simply copy and paste the above code
at the end of the Vagrantfile after the previous configuration block. Vagrant
runs all configuration blocks, overwriting the newest values over the older
values. Otherwise, you may simply copy the block contents and append it to the
block contents of your current Vagrantfile. Either way, things will work.
## Running it!
With everything setup, you can now test what we have so far. If you haven't yet
created the vagrant environment, run `vagrant up` to create it from scratch.
Otherwise, if you already ran `vagrant up` and chose to suspend or shut down
the environment during the last step, or even if its still running,
run `vagrant reload` to simply reload the environment, but not
create a new one.
If you have no idea what's going on, run a `vagrant down` to
tear down any potentially created vagrant environment, and start over with
a fresh `vagrant up`.
You should notice that provisioning is now part of the steps executed, and
Vagrant will even log and output the output of chef, so you can debug any
problems which may occur.
You can verify everything worked successfully by SSHing in to the running
environment and trying to execute `htop`:
{% highlight bash %}
$ vagrant ssh
...
vagrant-instance ~$ htop
...
{% endhighlight %}