diff --git a/_layouts/documentation.html b/_layouts/documentation.html
index 72c4ed4ca..482bf24cd 100644
--- a/_layouts/documentation.html
+++ b/_layouts/documentation.html
@@ -5,7 +5,13 @@
Overview
Commands
Vagrantfile
- Provisioning
+ Provisioners
+
+
Boxes
Base Boxes
Rake Integration
diff --git a/css/screen.css b/css/screen.css
index c58f20c70..39b03c448 100644
--- a/css/screen.css
+++ b/css/screen.css
@@ -158,6 +158,7 @@ blockquote {
.info {
padding-left: 52px;
+ padding-right: 15px;
margin-top: 0px;
margin-bottom: 10px;
border: 1px dotted #DDD;
diff --git a/docs/provisioners.md b/docs/provisioners.md
new file mode 100644
index 000000000..cf39b320a
--- /dev/null
+++ b/docs/provisioners.md
@@ -0,0 +1,38 @@
+---
+layout: documentation
+title: Documentation - Provisioners
+---
+# Provisioners
+
+Vagrant supports provisioning a project's VM through the use of _provisioners_,
+since spinning up a blank virtual machine is not very useful! The provisioners
+supported out-of-the-box with a Vagrant installation are: [Chef Solo](/docs/provisioners/chef_solo.html) and
+[Chef Server](/docs/provisioners/chef_server.html). These provisioners allow
+you to easily setup your virtual machine with everything it needs to run as
+a proper server (whether it be a web server, database server, utility server,
+or all those things combined).
+
+By default, Vagrant disables provisioning. Provisioning can be enabled by selecting
+the provisioner using the `config.vm.provisioner` configuration key. The value
+of this key is either a symbol to use a built-in provisioner, a class which
+inherits from `Vagrant::Provisioners::Base` for a custom solution, or `nil`
+to disable it.
+
+## Which Provisioner Should I Use?
+
+Ah, with the freedom of choice comes the complication of choosing
+what is right for you.
+
+* **Chef Solo** - Chef solo is most ideal if you're just getting started with
+ chef or a chef server is simply too heavy for your situation. Chef solo allows
+ you to embed all your cookbooks within your project as well, which is nice for
+ projects which want to keep track of their cookbooks within the same repository.
+ Chef solo runs standalone -- it requires no chef server or any other server to
+ talk to; it simply runs by itself on the VM.
+* **Chef Server** - Chef server is useful for companies or individuals which
+ manage many projects, since it allows you to share cookbooks across multiple
+ projects. The cookbooks themselves are stored on the server, and the client
+ downloads the cookbooks upon running.
+* **Puppet, shell scripts, etc.** - Do you use something other than that which
+ is built into Vagrant? Provisioners are simply subclasses of `Vagrant::Provisioners::Base`,
+ meaning you can easily build your own, should the need arise.
\ No newline at end of file
diff --git a/docs/provisioners/chef_server.md b/docs/provisioners/chef_server.md
new file mode 100644
index 000000000..24d303c5b
--- /dev/null
+++ b/docs/provisioners/chef_server.md
@@ -0,0 +1,7 @@
+---
+layout: documentation
+title: Documentation - Provisioners - Chef Server
+---
+# Chef Server Provisioning
+
+Coming soon.
\ No newline at end of file
diff --git a/docs/provisioners/chef_solo.md b/docs/provisioners/chef_solo.md
new file mode 100644
index 000000000..96bbefe27
--- /dev/null
+++ b/docs/provisioners/chef_solo.md
@@ -0,0 +1,173 @@
+---
+layout: documentation
+title: Documentation - Provisioners - Chef Solo
+---
+# Chef Solo Provisioning
+
+[Chef Solo](http://wiki.opscode.com/display/chef/Chef+Solo) allows you to provision your virtual
+machine with [Chef Cookbooks](http://wiki.opscode.com/display/chef/Cookbooks) without requiring a
+[Chef Server](http://wiki.opscode.com/display/chef/Chef+Server). At a very basic level, [chef](http://www.opscode.com/chef/)
+is an open source systems integration framework which automates tasks through programmable "cookbooks."
+This page will not go into the details of creating custom chef cookbooks, since that
+is covered in detail around the web, but a good place to start is the [opscode cookbooks repository](http://github.com/opscode/cookbooks)
+which contains cookbooks for most of the popular server software already made.
+
+## Setting the Cookbooks Path
+
+First, Vagrant needs to know where the cookbooks are located. By default, Vagrant will
+look in the "cookbooks" directory relative to the root of the project directory (where
+a project's Vagrantfile is). The cookbooks directory should have a structure similar to
+the following:
+
+{% highlight bash %}
+$ ls cookbooks/
+apache2/
+passenger_apache2/
+rails/
+sqlite/
+vagrant_main/
+{% endhighlight %}
+
+Basically, the cookbooks directory should immediately contain all the folders of the
+various cookbooks.
+
+To tell Vagrant what the cookbook path is, set it up in your Vagrantfile, like so:
+
+{% highlight ruby %}
+Vagrant::Configure.run do |config|
+ # This path will be expanded relative to the project directory
+ config.chef.cookbooks_path = "cookbooks"
+end
+{% endhighlight %}
+
+
+
Multiple Cookbook Paths
+
+ You can also specify multiple cookbook paths by making the configuration an
+ array of file paths. Every file path will be expanded relative to the project
+ directory, and chef solo will then look in every directory for the cookbooks.
+
+{% highlight ruby %}
+Vagrant::Configure.run do |config|
+ config.chef.cookbooks_path = ["cookbooks", "~/company/cookbooks"]
+end
+{% endhighlight %}
+
+
+
+## Configuring the Main Cookbook
+
+By default, Vagrant is configured to run a single cookbook called `vagrant_main`.
+This cookbook is known as the "vagrant main cookbook" and is analogous to the
+main entry point of an executable program. This main cookbook should include
+other cookbooks in the order they should be run to setup the system.
+
+An example `vagrant_main` default recipe file is shown below:
+
+{% highlight ruby %}
+# vagrant_main cookbook
+# This cookbook includes and sets up a server with apache, mysql,
+# rails, and passenger. It finally runs a custom cookbook to configure
+# the application.
+#
+require_recipe "apache2"
+require_recipe "mysql"
+require_recipe "rails"
+require_recipe "passenger_apache2::mod_rails"
+require_recipe "my_custom_application"
+{% endhighlight %}
+
+If you want Vagrant to use a cookbook other than `vagrant_main` as the default,
+this can be changed using the Vagrantfile:
+
+{% highlight ruby %}
+Vagrant::Config.run do |config|
+ config.chef.run_list.clear
+ config.chef.add_recipe("my_recipe")
+end
+{% endhighlight %}
+
+
+
Why the main cookbook at all?
+
+ Some people ask, "Why does Vagrant default to the vagrant_main cookbook at all?"
+ The reason is that its more portable to require all recipes within a single cookbook
+ than to define them all using add_recipe
in the Vagrantfile. By
+ requiring all the recipes in a single meta-cookbook, you can then reuse that cookbook
+ for production environments and so on. Vagrant is basically encouraging you
+ to write more portable cookbooks!
+
+
+ Of course, if you don't like this, you're free to define your own recipes
+ as shown above.
+
+
+
+## JSON Configuration
+
+Every chef cookbook has access to the `node` variable which is a hash containing
+server-specific configuration options which can be used to control provisioning.
+By default, Vagrant JSON configuration looks like the following:
+
+{% highlight ruby %}
+{
+ :instance_role => "vagrant",
+ :vagrant => {
+ :config => { ... }, # Full Vagrant config
+ :directory => "/vagrant" # Or wherever configured project directory is
+ }
+}
+{% endhighlight %}
+
+This JSON configuration is specifically thought out such that the `instance_role`
+key could be used so that cookbooks could be shared between production and development,
+possibly tweaking paths or configuration based on the `instance_role`. And
+`project_directory` is useful if you're setting up a VirtualHost for a web server,
+for example, and need to set the path to the public directory within your
+`project_directory`.
+
+But sometimes, cookbooks need additional, custom JSON configuration. For this
+you can specify additional JSON data in the Vagrantfile:
+
+{% highlight ruby %}
+Vagrant::Configure.run do |config|
+ # merge is used to preserve the default JSON configuration, otherwise it'll
+ # all be overwritten
+ config.chef.json.merge!({
+ :load_limit => 42,
+ :chunky_bacon => true
+ })
+end
+{% endhighlight %}
+
+## Configuring the Server Path
+
+In order to run chef, Vagrant has to mount the specified cookbooks directory as a
+shared folder on the virtual machine. By default, this is set to be `/tmp/vagrant-chef`,
+and this should be fine for most users. But in the case that you need to customize
+the location, you can do so in the Vagrantfile:
+
+{% highlight ruby %}
+Vagrant::Configure.run do |config|
+ config.chef.provisioning_path = "/tmp/vagrant-chef"
+end
+{% endhighlight %}
+
+This folder is created for provisioning purposes and destroyed once provisioning
+is complete.
+
+## Enabling and Executing
+
+Finally, once everything is setup, provisioning can be enabled and run. To enable
+provisioning, tell Vagrant to use chef solo in the Vagrantfile:
+
+{% highlight ruby %}
+Vagrant::Config.run do |config|
+ config.vm.provisioner = :chef_solo
+end
+{% endhighlight %}
+
+Once enabled, if you are building a VM from scratch, run `vagrant up` and provisioning
+will automatically occur. If you already have a running VM and don't want to rebuild
+everything from scratch, run `vagrant reload` and provisioning will automatically
+occur.
\ No newline at end of file
diff --git a/docs/provisioners/others.md b/docs/provisioners/others.md
new file mode 100644
index 000000000..b7ffbcc2d
--- /dev/null
+++ b/docs/provisioners/others.md
@@ -0,0 +1,7 @@
+---
+layout: documentation
+title: Documentation - Provisioners - Others
+---
+# Provisioning with Other Tools
+
+Coming soon.
\ No newline at end of file