Building a Vagrant Box with VeeWee

This is a quick follow up to my previous post where I described how I got started using Vagrant and Chef. This time around I want to detail the process of creating a base box from scratch. Why build a box from scratch? Security for one, but mainly just for the hell of it. I'm using another handy RubyGem, this one's called VeeWee. It handles the tedious steps like downloading ISOs and configuring the box. Give it some shell scripts and it runs them post installation, helpful for getting libraries installed.

Install VeeWee

First up then, install the VeeWee gem.

$ gem install veewee

As well as providing its own binary, VeeWee extends Vagrant by adding the 'basebox' subcommand to it. Run vagrant basebox to see a list of options.

Create a Box Definition

A good starting point is using a template on which to base the box definition.

$ vagrant basebox templates

This prints out the templates available on GitHub. I'm using the CentOS-6.3-x86_64-minimal template in this example.

$ vagrant basebox define 'CentOS-6.3-x86_64' 'CentOS-6.3-x86_64-minimal'

This generates a definitions folder with the VeeWee config and some post installation shell scripts. I've created a repos on GitHub with my own modifications and additions to the template. I'm installing rbenv and some additional plugins. I then use rbenv to build and install the latest version of Ruby.

Build & Export

Next up, the box is built. This might take a while...

$ vagrant basebox build 'CentOS-6.3-x86_64'
$ vagrant basebox validate 'CentOS-6.3-x86_64'

Following the build, the box is exported to the Vagrant .box format.

$ vagrant basebox export 'CentOS-6.3-x86_64'

Add to Vagrant

Now it's possible to add the newly created box to Vagrant (I covered these steps in my previous post).

$ vagrant box add 'CentOS-6.3-x86_64' ''

We're just left to initialise the box, add recipes and boot it. Job done.

$ vagrant init 'CentOS-6.3-x86_64'
$ vagrant up
$ vagrant ssh

Moz Morris

Moz Morris

Freelance Web Developer