Vagrant: una sencilla forma de personalizar una box base

Luego de unos meses utilizando y limitandome a tan solo instalar Vagrant y aprovisionar las cajas (box), al momento de querer personalizarlas para poder utilizarlas en otros equipos y tener siempre listo un entorno para desarrollo, me he dado a la tarea de documentarme un poco mas sobre Vagrant y preparar una receta que me permita personalizar una de las cajas bases (box) que se descargan desde Vagrantbox.es . Para los que no lo saben Vagrantbox.es es un sitio web desde donde se enlazan distintas cajas (box) base en sus distintas distros y sabores.

Al momento de redactar este post, he utilizado Vagrant en su versión 1.4.1 y VirtualBox en su versión 4.3.6. Lo primero que tendremos que relizar es "agregar la box" para ello utilizaremos la forma como se muestra en el sitio de Vagrantbox.es :

$ vagrant box add {title} {url}

En donde {title} es el nombre que contendrá tu box base y {url} es la dirección desde donde nos traeremos la box hosteada, en mi caso usare un box base de Centos 6.4 i386 minimal (revizar luego en el sitio web de Vagrantbox.es el estado de la box). Para este post, he creado un directorio en donde colocaremos el archivo de configuración de Vagrant, para ello realizaremos los siguienets pasos:

$ mkdir ~/centos6
$ cd ~/centos6
$ vagrant box add centos6 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20130731.box

Luego de terminada la descarga de nuestro entorno base, se mostrara el siguiente mensaje:

Successfully added box 'centos6' with provider 'virtualbox'!

Podremos verificar el listado de las boxes que tenemos en nuestro equipo con un simple comando:

$ vagrant box list

Procederemos a inicializar la caja base con el comando, recuerden que estamos dentro del directorio ~/centos6:

$ vagrant init

Luego de haber ejecutado el anterior comando, recibiremos un mensaje en el que nos indican que se ha creado un archivo de configuración y que lleva por nombre Vagrantfile, lo podemos encontrar en ~/centos6/Vagrantfile. Si lo abrimos, nos encontramos con parametros de configuración de la caja (box) base. En mi caso, me ha tocado cambiar el valor:

config.vm.box = "base"

por el nombre que le he asignado a mi caja base, quedando de la siguiente forma:

config.vm.box = "centos6"

Editado el archivo Vagrantfile, procedemos a iniciar la caja base, simplemente escribimos el comando de iniciar y se mostrara lo siguiente:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports... [default] -- 22 => 2222 (adapter 1)
[default] Booting VM... [default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready! [default] Mounting shared folders...
[default] -- /vagrant
[default] VM already provisioned. Run `vagrant provision` or use `--provision` to force it

Realizado lo anterior, nos conectaremos a la caja base y luego actualizaremos el entorno, es decir, actualizaremos los paquetes de la distro, e instaleremos los paquetes necesarios para tener nuestro entorno de desarrollo:

$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
$ sudo yum update -y
$ sudo yum install wget curl git htop httpd php mysql-server php-mysql phpMyAdmin
$ vagrant reload

Es de mencionar que al momento de instalar los paquetes necesarios para el desarrollo, los que no se encuentran dentro de los repositorios oficiales de la distribución, tendrán que ubicarlos en repositorios alternativos.

Ya deberiamos tener todos los paquetes necesarios para nuestro entorno de desarrollo que queremos distribuir, por lo que procederemos a crear nuestro package que podrá ser usado como una box base o ser distribuido a otros. Tomamos de la documentación de Vagrant el siguiente comando:

$ vagrant package --base NAME --output NAME

Por lo que haremos:

$ vagrant package --base centos6 --output ~/centos6-x86_64-dev-06012014.box

El proceso tomara unos minutos y al momento de crearse la box base, se mostrara la siguiente salida:

[default] Attempting graceful shutdown of VM...
[default] Clearing any previously set forwarded ports...
[default] Creating temporary directory for export...
[default] Exporting VM...
[default] Compressing package to: /home/zokeber/centos6-x86_64-dev-06012014.box

La caja base personalizada se encuentra en el directorio de usuario /home/zokeber/ y lleva por nombre centos6-x86_64-dev-06012014.box . Posterior a esto, podremos distribuir nuestra box base a otros equipos, en el otro equipo tendrán que tener instalado Vagrant + VirtualBox.

Para iniciar un nuevo proyecto con la box base creada, crearemos un nuevo directorio y agregaremos la box base:

$ mkdir ~/centos65-dev
$ cd ~/centos65-dev
$ vagrant box add centos65-dev vagrant /home/$USER/centos6-x86_64-dev-06012014.box

Realizado lo anterior, mostrara la salida:

Downloading box from URL: file:/home/zokeber/centos6_i386-dev-06012013.box
Extracting box...te: 29.8M/s, Estimated time remaining: --:--:--)
Successfully added box 'centos65-dev' with provider 'virtualbox'

Por ultimo, para iniciar nuestra nueva box base, ejecutaremos:

$ vagrant init
$ vagrant up
$ vagrant ssh

Realizado esto, ya tenemos corriendo nuestro box base con todos los paquetes necesarios para nuestro entorno de desarrollo.