Vagrant: construye tu entorno de trabajo

De siempre me he dado cuenta de que muchas veces intento modificar algún proyecto, algún entorno que requiere de un entorno de trabajo muy específico y me paso unas cuantas horas rehaciendo ese entorno en mi PC a través de técnicas como rvm, kerl o más llanamente con el update-alternatives de Debian. Pero, ¿cómo podría tener un entorno de trabajo desde cero y en muy poco tiempo funcionando?

La respuesta llega con la virtualización. Aunque no con la virtualización en sí y sin más. VirtualBox se desmarcó como software libre para virtualización hace mucho tiempo gracias a su sencillez y versatilidad. Junto con esta herramienta han aparecido otras que ayudan a automatizar no solo la construcción de una máquina virtual, sino un entorno de trabajo dentro de la máquina virtual fácilmente replicable y utilizable por todos y cada uno de los componentes del equipo de trabajo.

Esta herramienta, como se muestra en el título, es vagrant. Vagrant es un sistema que nos permite crear una máquina virtual, no solo en VirtualBox sino también con otras soluciones comerciales más avanzadas. Pero no solo eso, sino que nos ayuda a iniciar la misma con una instalación base descargada y operativa de alguno de los repositorios existentes de distribuciones, como por ejemplo vagrantbox.es.

Instalando una máquina virtual

Los comandos de vagrant son muy simples. Si quisiéramos montar una máquina virtual basada en OpenBSD 5.3 de 64 bits, por ejemplo, solo tendríamos que escribir algo como lo siguiente (basado en la URL presente en vagrantbox.es):

vagrant box add OpenBSD https://dl.dropboxusercontent.com/u/12089300/VirtualBox/openbsd53_amd64_vagrant12.box
vagrant init OpenBSD
vagrant up

Esto nos daría una máquina virtual operativa y encendida tras la ejecución del último comando. Las tareas que realiza son la descarga de la caja, la instalación en virtualbox y su inicio.

Las máquinas descargadas se almacenan en el sistema. Podemos ver las cajas descargadas a través del comando siguiente:

vagrant box list

Crear una máquina virtual basándonos en cualquiera de las cajas ya descargadas es muy rápido y fácil. Solo tenemos que desplazarnos al directorio donde vayamos a crear nuestro proyecto y ejecutar de nuevo el comando init.

Arrancar, Suspender, Recuperar…

Al crear la máquina virtual podemos arrancarla con el comando up, suspender su ejecución (algo así como la hibernación) y reanudar la ejecución. Podemos detenerla completamente o incluso destruirla definitivamente.

Cada uno de esos comandos es simple, no tiene una lista de argumentos elaborada:

vagrant up       # inicia la máquina
vagrant suspend  # suspende la máquina
vagrant resume   # vuelve a encenderla
vagrant halt     # la apaga 
vagrant destroy  # la destruye

Son comandos muy simples e intuitivos que nos evitan el tener que manejar una interfaz visual permitiéndonos incluso automatizar a través de nuestro editor el arranque de la máquina, el resume y suspend por ejemplo entre ejecución y ejecución para no consumir muchos recursos, etc.

Finalmente, si no necesitamos más la máquina, podemos eliminarla definitivamente o eliminarla para volverla a crear de nuevo con el comando up. En poco tiempo tenemos una máquina nueva para comenzar de nuevo a trabajar.

Acceso a la máquina

Una máquina recién instalada puede ser accesible a través de SSH normalmente. A través del comando vagrant ssh podemos acceder de forma rápida a la consola sin necesidad de introducir ninguna contraseña.

Provisión

Lo que más me llama la atención de vagrant es su potencial en cuanto a un comando llamado provision. Permite el uso de chef o puppet para la preparación y configuración de la máquina. No obstante para que esto funcione, antes habrá que realizar la configuración pertinente de chef o puppet, dependiendo de cuál vayamos o queramos usar.

Para poder usar provision primero debemos crear un fichero de configuración: Vagrantfile. Este fichero debe contener los parámetro de configuración para el modo de provisión a emplear. De forma simple podemos utilizar a modo de ejemplo un provisionador basado en shell:

Vagrant.configure("2") do |config|
    config.vm.provision "shell", inline: "apt-get update"
end

Al ejecutar provision el sistema mostrará la ejecución del apt-get update y su salida dentro de la consola de la máquina virtual.

Más de Vagrantfile

El fichero de configuración permite indicar la imagen de la máquina a instalar, la URL de donde descargarla y configuración de la máquina propia como los puertos para hacer forward de la máquina virtual, puntos de montaje que serán necesarios si queremos utilizar recetas de chef, por ejemplo y un largo etc que puedes ir revisando en la página de documentación del proyecto.

Conclusiones

Después de revisar el proyecto más a fondo y utilizarlo detenidamente he visto el potencial que encierra y lo que me he estado perdiendo en todos estos años. Crear entornos para poder trabajar (servidores web, base de datos, usuarios, …) es algo esencial en el trabajo de cualquier programador de sistemas o devops. Esta herramienta sin duda debe de formar parte indiscutible de la utilería básica para todos los que nos dedicamos a trabajar con escenarios variantes y en ocasiones complejos.