Eu já falei um pouco sobre o Vagrant e sobre a filosofia DevOps. No post sobre Vagrant mostrei como usar um box Ubuntu publicamente disponível e quão fácil é usar um provisionador shell para configurar um box LAMP básico.

Então eu disse que existem boxes publicamente disponíveis mas omiti o site Vagrant boxes. Por que da omissão? Simplesmente eu não os acho tão úteis e acho que as desvantagens superam os benefícios. Pegar um box que você não sabe como foi coonfigurado por levar a sérios problemas de segurança. E se o box é apenas uma instalação básica, é quase sem real utilidade já que você precisará fazer o provisionamento da sua configuração desejada a cada vez que iniciar uma VM baseada no box.

E por que não criar um box base? Veewee ao resgate!

Veewee

O Veewee é uma ferramenta para criar boxes Vagrant e imagens KVM, VirtualBox e Fusion facilmente. Mãos a obra, vamos abrir um terminal. Você precisará ter o RubyGems instalado na sua máquina para instalar o Veewee. Leia o post sobre o Vagrant para ver como instalá-lo. Vamos instalar a última versão alpha disponível (observação: os seguintes comandos foram testados em um velho e bom MacOS X Leopard).

$ sudo gem install veewee --pre

Veewee vem com muitos templates de sistemas operations que você pode usar para criar seu box base Vagrant ou imagem de VM (e é por isso que usamos a última versão alpha já que contém templates atualizados para os principais sistemas operacionais). Você pode listar os templates disponíveis usando o seguinte comando:

$ vagrant basebox templates | sort

Existem templates para distros Linux populares (Debian, Ubuntu, CentOS, Scientific Linux), alguns sabores Unix (Solaris, FreeBSD) e até mesmo a preview release 8 do Windows. Vamos criar um box Debian. Primeiro, vamos definir o nosso box base com o nome ‘squeeze64-lamp’ usando o Debian 6.0.4 AMD64.

$ mkdir -p ~/Dev/veewee/squeeze/amd64
$ cd ~/Dev/veewee/squeeze/amd64
$ vagrant basebox define squeeze64-lamp Debian-6.0.4-amd64-netboot
[vagrant] The basebox 'squeeze64-lamp' has been succesfully created from the template 'Debian-6.0.4-amd64-netboot'
[vagrant] You can now edit the definition files stored in definitions/squeeze64-lamp or build the box with:
[vagrant] vagrant basebox build 'squeeze64-lamp'

Nós podemos ver alguns arquivos no diretório definitions/squeeze64-lamp que são usados para instalar o software necessário para um box base Vagrant:

$ ls definitions/squeeze64-lamp/
base.sh       cleanup-virtualbox.sh definition.rb      puppet.sh       vagrant.sh        zerodisk.sh
chef.sh       cleanup.sh            preseed.cfg        ruby.sh         virtualbox.sh

O principal arquivo aqui é o definition.rb. Ele tem um hash com algumas definições da VM VirtualBox (como o número de CPUs e tamanhos de memória e disco), definições de boot e do Kickstart - que são usadas para automatizar a instalação do sistema operacional - e os arquivos de pós-instalação. Vamos configurar o mesmo box LAMP do post sobre Vagrant. Faça o download ou clone o repositório Git vagrant-shell-scripts e altere os arquivos de pós-instalação em definitions.rb usando o seguinte trecho:

:postinstall_files => [
  "base.sh",
  "vagrant.sh",
  "virtualbox.sh",
  "ruby.sh",
  "puppet.sh",
  "chef.sh",
  "dotdeb.sh",
  "db-mysql.sh",
  "dev-tools.sh",
  "php5.sh",
  "php5-qa.sh",
  "php5-tools.sh",
  "drush.sh",
  "cleanup-virtualbox.sh",
  "cleanup.sh",
  "zerodisk.sh"
],

Dica: coloque seus arquivos de pós-instalação após o arquivo base.sh e antes do arquivo cleanup.sh.

Com tudo no lugar, cria seu box! Isto pode levar algum tempo já que será feito o download do Virtual Box Guest Additions e da imagem ISO do sistema operacional (mas apenas para a primeira vez).

$ vagrant basebox build squeeze64-lamp

Após criar o box, valide-o:

$ vagrant basebox validate squeeze64-lamp

Com os testes ok, exporte seu box:

$ vagrant basebox export squeeze64-lamp

Agora você tem um box base Vagrant customizado ao qual pode distribuir para o seu time de TI. Apenas adicione-o no Vagrant e comece a usá-lo!

$ vagrant box add squeeze64-lamp squeeze64-lamp.box
$ vagrant init squeeze64-lamp
$ vagrant up
$ vagrant ssh