Cómo configurar un entorno de desarrollo virtualizado con Vagrant

Ya hemos abordado el tema de la virtualización de los entornos de desarrollo desde un enfoque teórico, explicando sus ventajas y las situaciones que resuelve. Así que, en esta ocasión, vamos a introducirnos en el terreno de lo práctico, explicando cómo podemos conseguir un entorno de desarrollo virtualizado con Vagrant.

En líneas generales, Vagrant es un software libre que crea una capa por encima de la virtualización, permitiendo operar y definir las acciones  mediante una interfaz común y expresada a través de código. Esas acciones se expresan mediante un script, en el que se declara qué tipo de infraestructura virtualizada se desea crear. Vagrant se encarga de conversar con el correspondiente proveedor de virtualización, lo que permite abstraernos en la práctica sobre si estamos trabajando con VirtualBox, VMWare, Hyper-V, Docker o similares.

Vagrant es un software libre que podemos obtener directamente desde su página web www.vagrantup.com. No podemos olvidar que, antes de instalar Vagrant, debemos tener instalado el software de virtualización con el que va a trabajar, como los conocidos VirtualBox, o VMware. El más utilizado es VirtualBox, gratuito y multiplataforma.

Otra de las características más destacadas de Vagrant es proporcionar varias distribuciones de imágenes de máquinas virtuales, con un sistema operativo definido, que se denominan «box» (caja en inglés). Cuando creamos máquinas virtuales con Vagrant podemos basarnos en una box determinada, para comenzar ya con un sistema operativo configurado de antemano. El catálogo de boxes de Vagrant lo podemos ver en la página https://app.vagrantup.com/boxes/search

Primeros pasos con Vagrant

Usar Vagrant es bastante sencillo. Una vez instalado, nuestros primeros pasos se realizarán a partir de la línea de comandos.

Lo primero que podemos hacer es descargar alguna de las box de Vagrant del catálogo mencionado anteriormente. Lo hacemos con el comando:

vagrant box add ubuntu/xenial64

Así estamos obteniendo la box llamada ubuntu/xenial64. En unos minutos, dependiendo de la velocidad de nuestra conexión, habremos obtenido la imagen en local y estaremos en disposición para usarla para la creación de una nueva máquina virtual.

Ahora podemos crear una virtualización basada en la box descargada en el paso anterior. Para ello lo ideal es crear un directorio de trabajo y situarnos en él.

mkdir vagrant-iniciacion
cd vagrant-iniciacion

Luego lanzamos el comando para crear el archivo de configuración de nuestra virtualización:

vagrant init ubuntu/xenial64

Esto nos producirá la siguiente salida por consola.

Nos están informando que se ha creado en esta carpeta es un archivo Vagrantfile, que es donde se deben especificar los detalles de la máquina virtual que se va a generar en nuestro espacio de trabajo. En el archivo  Vagrantfile podemos especificar cosas como la cantidad de recursos de la máquina, su dirección IP, los puertos que tiene abiertos y un largo etc.

Como primera aproximación, podemos abrir el archivo Vagrantfile con un editor de texto y analizar su código. Veremos que la mayoría son comentarios (las líneas que comienzan por #), que nos ayudan a entender qué tipo de cosas podemos especificar en este fichero de configuración.

Para poder ejecutar la máquina recién declarada realizamos el comando:

vagrant up

La primera vez que lanzamos este comando tardará un poco, porque se tiene que aprovisionar la máquina virtual. Obtendremos una salida como esta:

Esto producirá que la máquina se arranque también y se quede en estado de ejecución. Finalmente, podemos conectarnos a la shell de la virtualización con otro comando útil:

vagrant ssh

Dos comandos extra nos sirven para realizar otras tareas administrativas sobre las máquinas:

  • vagrant halt. Apaga la máquina virtual.
  • vagran destroy. Elimina la virtualización de nuestro sistema.

Crear configuraciones de servidores de manera sencilla

Nuestra tarea como administradores de máquinas virtuales vía Vagrant se puede complicar un poco cuando comenzamos a avanzar en la personalización de la máquina virtual que se desea aprovisionar. Tendremos, mediante código, que indicar los recursos de la máquina, pero también qué software debe instalarse, qué puertos deben ocupar nuestros servicios, que motores de bases de datos vamos a usar, etc.

Otro detalle de suma importancia es configurar las carpetas se deben sincronizar entre el host y el guest (entre la máquina física y la virtualización). Esto nos permite que en local sigamos trabajando con nuestros editores o IDEs preferidos, escribiendo los archivos del proyecto en un directorio de nuestra máquina física, igual que estamos acostumbrados en el día a día. Ese directorio simplemente estará sincronizado con otra carpeta en la máquina virtual, de modo que al editar el código del proyecto, estaremos cambiando directamente los archivos en el entorno de desarrollo.

Todos estos pasos, como decimos, no resultan tan sencillos de explicar en un post como este, pero tenemos una solución que seguramente satisfaga la mayor parte de las necesidades de proyectos web.

PuPHPet

PuPHPet es un software online que, mediante un asistente, nos permite indicar qué características deben tener las máquinas virtuales que se desean crear con Vagrant. El asistente recorre todo tipo de configuraciones, desde la IP del servidor de desarrollo, la memoria, el número de CPU, etc. hasta el detalle del servidor web que será instalado, la imagen, bases de datos, los lenguajes disponibles, el software para envío de email, los programas para gestión de colas y mucho más.

Una vez recorrido todo el asistente, PuPHPet nos permitirá descargar el archivo de configuración de la máquina y nos indicará de manera clara y sencilla los pasos que se tienen que hacer para ponerla en funcionamiento.

Básicamente se trata de colocar el contenido del zip descargado en una carpeta de trabajo y lanzar el comando para aprovisionamiento de la máquina virtual (vagrant up).

Con esto , además, compartiremos ese mismo archivo de configuración con todo el equipo de desarrollo. Así nos aseguraremos de que todos los integrantes comparten el mismo entorno de ejecución en la etapa de desarrollo.