Posted: 11 Oct. 2022 4 minutos Tiempo de lectura

¿Qué es Vagrant?

Introducción

Soy Gonzalo Muriel, senior delivery consultant en Deloitte con más de ocho años de experiencia en el sector IT. A lo largo de mi vida laboral siempre me he centrado en el desarrollo web, y como tal he participado en muchos proyectos, grandes y pequeños. Durante toda mi carrera profesional he estado aplicando las últimas tecnologías de desarrollo, así como las más recientes herramientas y métodos de coordinación de equipo.

Hoy os vengo a hablar de la integración tecnológica que hemos implantado en el proyecto en el que trabajo actualmente. Esta herramienta se llama Vagrant y es un producto de software libre desarrollado por HashiCorp, y la utilizamos para que los procesos de desarrollo en entorno local sean mucho más agiles.

Hoy en día, la mayoría de nuestros clientes han migrado sus datacenters al Cloud, es por ello que probar los desarrollos en entorno local nos ayuda a detectar antes los errores y supone un ahorro, tanto en tiempo como en coste, delegando a una fase más madura los despliegues en los distintos entornos Cloud. 

Los proyectos de cierta envergadura suelen tener asignados un equipo de desarrollo multidisciplinar (developers, arquitectos, testers, analistas, etc). Acelerar el proceso de configuración de los entornos redunda en una mejora de la productividad, permitiendo dedicar el tiempo a otras tareas que aporten valor añadido a nuestros clientes.

La principal ventaja que nos ofrece Vagrant a nivel de desarrollo es anticipar la posibilidad de ejecutar las pruebas de integración en todos los entornos, desde el entorno local hacía el resto de stages (desarrollo, integración y producción). 

Pues gracias a la herramienta Vagrant, desarrollada por HashiCorp, podremos virtualizar las infraestructuras clave del proyecto, de tal forma que cada componente del equipo tenga una copia exacta de esta infraestructura en su entorno local de una forma sencilla y rápida. Sin margen para errores humanos en su instalación y creando un canon que todos los desarrolladores tendrán en su máquina. Además, puede agilizar la experiencia de usuario de los nuevos miembros del equipo en los procesos de on-boarding del proyecto, llegando a mejorar la integración de dichos nuevos compañeros en la cadena productiva del equipo. 

 

¿Qué es Vagrant?

Vagrant es un software que nos permite configurar una instancia de una máquina virtual mediante un archivo de configuración. Este archivo nos permite configurar el sistema operativo, redes, redirección de puertos, usuarios, scripts de aprovisionamiento, etc.

Vagrant es muy útil para los equipos de desarrolladores y operadores de sistemas, ya que permite aprovisionar entornos de forma automatizada y alineada. Es decir, adiós al "en mi máquina funciona", porque el resultado de ejecutar el archivo de configuración o Vagrantfile, siempre nos proporciona una instancia configurada de la misma forma independientemente de en qué host se ejecute. Además de tener nuestro entorno de desarrollo configurado y listo para funcionar en unos 5 minutos. Desde el punto de vista de un desarrollador que no use esta herramienta, dependiendo del proyecto, montar un entorno de desarrollo puede llevarte desde 30 mins hasta varios días por errores de instalación, preguntas a compañeros, etc…

Además, si se añade al repositorio del proyecto como un recurso más, se puede mantener actualizada la infraestructura según las necesidades que surjan durante el desarrollo del proyecto.

Pasemos a una prueba técnica para introducirnos en el uso básico de esta herramienta.

 

Hands on

El primer requisito es tener instalado Vagrant en nuestro equipo y algún gestor de máquinas virtuales, como VirtualboxVmware, etc. En nuestro caso usaremos VirtualBox.

Para enunciar su uso vamos a mostrar su aplicación en un proyecto real.

El proyecto en cuestión está en pleno proceso de evolución tecnológica. Para simplificar la infraestructura existente, nos centraremos en un único componente: MySQL 5.5. Dicho servidor de base de datos tiene unas vulnerabilidades detectadas que nos obliga a actualizarlo a la versión 8.0.

El proyecto web está instalado en varios clientes, así como en un entorno de desarrollo que es usado por un equipo funcional para detectar nuevas funcionalidades a implementar. Es por ello por lo que la actualización debe testearse en local para no bloquear el trabajo y, a la vez, mantener el entorno antiguo hasta el día de la implantación, para poder solucionar posibles hotfix lo más rápido posible.

Con objeto de dejar intacto el entorno actual de desarrollo, se decide utilizar Vagrant para generar una MV (Máquina Virtual) y exponer dicho servicio MySQL Server 8.0. El objetivo es levantar dicha máquina minimizado el uso de espacio en disco y automatizar todas las tareas de configuración del esquema de base de datos.

Abrimos una terminal y ejecutamos: vagrant init lo que nos creará un vagrantfile por defecto.

A continuación, lo modificamos de la siguiente forma:

Pasemos a destacar la configuración principal existente en este archivo:

  • config.vm.box: está es la imagen que usa Vagrant para poner la máquina base. Tiene formato USER/BOX. Es un repositorio público, por lo que es recomendable usar boxes de organismos oficiales como hashicop o bento. Se pueden analizar distintas box ya configuradas o con software ya instalado. Lo ideal sería que cojamos la base que nos hace falta y los servicios lo configuremos a nuestro gusto. A no ser que un box tenga todo lo necesitamos ya hecho. En nuestro caso, como se puede ver, usaremos hashicorp/bionic64, una máquina Ubuntu 18.04 LTS 64-bits. 
  • config.vm.define: aquí estamos definiendo un bloque environment lo que nos permite tener más de una máquina con la misma base y distinta configuración. Llegando a configurar su red privada para ofrecer una arquitectura muy parecida a la que podríamos configurar en un cloud, en donde cada servicio estaría en máquinas separadas. Como ejemplo, podríamos poner además del environment que vemos en el archivo de configuración que corresponde a la máquina de mysql o BBDD, una máquina para el servidor web. 
    • db.vm.network: como podemos ver, la nomenclatura ha cambiado, ya no empieza por config.vm… Lo que indica que esta configuración sería para la instancia db-server. Con esta directriz, configuramos el reenvío de puertos mapeando el servicio para que pueda comunicarse con el exterior de la MV a nuestra máquina física. Guest sería la máquina virtual y host sería nuestra máquina física. Como podéis ver, mapeamos el puerto de mysql (3306) de la MV a nuestro host.
    • db.vm.provision: por último, el aprovisionamiento de la máquina. Hasta el punto anterior, ya tendríamos nuestro sistema operativo listo para trabajar conectándonos a través de ssh. El aprovisionamiento se puede hacer inline, es decir, los comandos a ejecutar en el propio vagrantfile o a través de un archivo externo. En nuestro caso, hemos usamos esta última opción. Como el S.O. está basado en Unix, creamos un archivo shell script donde pondremos todas las acciones que se tienen que realizar al levantar la máquina por primera vez.

A continuación, veremos el archivo bootstrap.sh que hemos realizado en el proyecto para dejar la máquina totalmente preparada para que cualquier desarrollador tenga la BBDD lista para trabajar en local.

A grandes rasgos, lo que realiza el script de aprovisionamiento bootstrap.sh es:

  • Instalación del mysql-server 8.0 con opciones especificas
  • Creación los schemas en las BBDDs
  • Importar backups de cada BBDD
  • Crear el usuario para que se puedan conectar desde fuera de la MV

 

Comandos

Todos los comandos se deben de ejecutar donde tengamos nuestro vagrantfile. En nuestro caso tenemos ./mysql80 

De esta forma indicamos a Vagrant sobre que configuración/máquina queremos ejecutar la instrucción:

Por lo que, si hemos seguido todos los pasos, tras hacer vagrant up en nuestra consola obtendremos lo siguiente:

 

Conclusiones y trabajo futuro

Tras la aplicación diaria de esta herramienta en nuestro entorno de trabajo, hemos observado las siguientes ventajas con respecto a los anteriores procedimientos:

  • Boots en el on-boarndig de desarrolladores a un proyecto. Esto nos permite que los miembros nuevos de un equipo de desarrollo puedan tener la infraestructura el primer día que entran en el proyecto y puedan empezar a desarrollar desde el día uno.
  • Consistencia en el testing en local. Así, llegan a desaparecer los errores aislados en entornos de algunos desarrolladores por la configuración de este.
  • Evangelización de configuración de stacks tecnológicos. El desarrollo de un buen vagrantfile que inicialice un stack tecnológico como LAMP o MEAN según la norma, permite que los usuarios de dicha máquina trabajen con la configuración recomendada afrontando los problemas que tendrán a la hora de configurar la misma infraestructura en producción.
  • Ahorro de espacio físico en máquina. Solo tienes lo que necesitas, y cuando lo dejes de necesitar solo tienes que destruir la MV y guardar tu vagrantfile (que ocupa menos de 1Kb). Es decir, guardas tu archivo de configuración por si algún otro día pudieras necesitar la infraestructura/herramientas que implementa.
  • Descripción de la infraestructura en el repositorio de código. Al ser el vagrantfile código, este se puede añadir al repositorio git para que la infraestructura quede asociada al código. Y, si surge la necesidad de añadir alguna otra herramienta, la evolución del vagrantfile nos indicará la evolución de la infraestructura.

Como trabajo futuro, sería interesante que una vez implantada una metodología en la que se usara este servicio por varios equipos, se implementase una biblioteca o API que permitiese que los desarrolladores pudiesen buscar las configuraciones que necesitasen para sus proyectos/pruebas. 

Posibles configuraciones útiles para desarrollar:

  • LAMP (Linux Apache Mysql PHP)
  • MEAN (Mongo Express Angular Nodejs)
  • Kubernetes Cluster
  • Docker/Podman
  • Web Servers (tomcat, jboss….)

 

Autor del artículo:

Gonzalo Muriel, senior delivery consultant en Deloitte