Vagrant: Instalación, configuración y ejemplos de uso

Vagrant: Instalación, configuración y ejemplos de uso

Sergio De Luz

Vagrant es una herramienta gratuita de línea de comandos que podemos instalar en Windows, GNU/LinuxMacOS X que permite generar entornos de desarrollo reproducibles y compartibles de forma muy sencilla. Para la creación de estas máquinas virtuales, Vagrant crea pequeños ficheros de configuración que podemos llevar de un entorno a otro. Esta herramienta nos permitirá facilitarnos enormemente el trabajo cuando tenemos que trabajar con entornos de desarrollo virtuales.

Si vas a querer usar esta herramienta de software, es necesario entender de primeras qué es y los distintos usos que puedes llevar a cabo. Por esto mismo, en RedesZone os vamos a explicar paso a paso todo sobre Vagrant, qué es, para qué sirve y una puesta en marcha. De esta manera, tendrás todo a tu disposición para que puedas hacer uso de esta herramienta sin ningún tipo de inconveniente.

 

¿Qué es Vagrant y para qué sirve?

Vagrant es un software de código abierto que nos permite crear y mantener entornos de desarrollo portables, puede trabajar con VMware, VirtualBox, Hyper-V, KVM, AWS e incluso también con contenedores de Docker, por tanto, es ideal para simplificar la configuración de estos software de virtualización. Vagrant está escrito en lenguaje Ruby, pero se permite utilizar otros lenguajes de programación sin ningún problema.

Los mencionados archivos de configuración son denominados Vagrantfiles, estos Vagrantfiles pueden ser compartidos entre desarrolladores para replegar en sus equipos máquinas virtuales ya creadas. La utilización de Vagrant es útil en equipos de desarrollo montados por varias personas. Puesto que nos permite asegurarnos de que todos y cada uno de los integrantes trabajan con el mismo entorno de desarrollo.

Además de solucionar problemas de compatibilidades de software con algunos sistemas operativos, nos permite que nuestros proyectos vayan acompañados de su entorno configurado, ya que los ficheros de configuración son archivos de texto plano y estos pueden ser versionados en plataformas como Git o subversión. De esta forma, permite que las personas que se incorporen en un proyecto ya comenzado tan solo tenga que descargar del repositorio, el proyecto, y ejecutar la orden Vagrant, con ello ya tendría listo su entorno de desarrollo para trabajar en el equipo.

Por defecto el comando Vagrant trabaja con VirtualBox, VirtualBox es un software de virtualización para la creación de máquinas virtuales. Pero Vagrant no nos limita solo a VirtualBox, podemos usar también VMware Workstation en Windows y VMware Fusion en MacOS, pero en MacOS además necesitamos un plugin de pago. A veces, algunas Boxes (entornos creados con Vagrant), podemos ejecutarlos en Parallels Desktop, otro asistente de virtualización pero este es de pago.

En cuanto a la arquitectura de Vagramt, utiliza «Provisioners» y también «Providers» como bloques de construcción para los entornos de desarrollo. Estos «Provisioners» son herramientas para que los usuarios puedan personalizar su configuración en entornos virtuales. Los «Providers» son los servicios que usa Vagrant internamente para configurar y crear los entornos virtuales. Un detalle importante es que Vmware y AWS son soportados a través de plugins, pero no de forma nativa.

Otro aspecto muy destacable de Vagrant es la gran comunidad que hay detrás de esta herramienta, podremos acceder a una sección de «Docs» donde tendremos toda la documentación de la herramienta explicada en detalle, además, también tenemos una sección de «Community» donde podremos poner en los foros nuestras dudas. Por supuesto, este proyecto está más vivo que nunca, y tendremos desde la web oficial un enlace al proyecto oficial de GitHub donde podremos acceder al código fuente, ver los fallos o bugs que hay y que se han solucionado, y poner dudas sobre el funcionamiento de una determinada función y mucho más. Por último, Vagrant es ampliamente utilizado por empresas tan conocidas como Mozilla, Expedia, Nokia o Disqus para el desarrollo interno de sus propias herramientas.

 

Primeros pasos con Vagrant

Una vez que se tiene en cuenta qué es y para lo que sirve, entonces hay que comenzar con los primeros pasos que hay que seguir para manejar y configurar esta herramienta. Para ello, comenzaremos viendo cuál es el proceso de instalación, seguido de la creación de una máquina virtual básica. Después, seguiremos con los distintos procesos de acceso a la máquina y, sobre todo, los comandos necesarios que hay que emplear para detenerla en cualquier momento.

 

Instalación y creación de una máquina virtual básica

El primer paso, como es habitual, es descargar e instalar Vagrant. Para ello, vas a tener acceder a su página web oficial que encontrarás directamente en el siguiente enlace y además instalar el proveedor de máquinas virtuales que queramos utilizar, que por defecto será VirtualBox, ya que es gratuito y viene integrado en Vagrant.

Vagrant, además de ser instalado a través de la interfaz gráfica de usuario, podemos instalarlo desde la línea de comandos, en el caso de MacOS deberemos de tener instalado Hombrew Cask. Para instalar Vagrant sobre línea de comando en MacOS ejecutaremos:

Y en el caso de Linux usaremos el gestor de paquetes que use la distribución, en el caso de distribuciones derivadas de Debian usaremos:

sudo apt install vagrant

Una vez instalado, podremos ejecutar el comando ‘vagrant’ para obtener un listado de las opciones disponibles. Además de que te servirá para verificar que la app de este software está instalada correctamente en tu equipo. Para ello, solo hace falta acceder a la terminal de tu sistema operativo y poner ese mismo comando.

Por otro lado, para la creación de una maquína virtual podemos recurrir a su web de Boxes y elegir la más conveniente en el ejemplo lo haremos con Ubuntu xenial.

Tras ejecutar estos comandos, Vagrant init descargará e instalará una máquina virtual de VirtualBox con el sistema operativo Ubuntu 16.04 LTS 64-bit. Luego genera el fichero de configuración “Vagrantfile” en el directorio actual y tendrá un contenido similar al siguiente.

VAGRANTFILE_API_VERSION = «2»

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = «ubuntu/xenial64»

end

De este fichero hablaremos más en profundidad en las siguientes secciones. En este momento sólo hay que saber que en el vagrantfile estamos indicando a Vagrant que queremos utilizar la imagen ‘ubuntu/xenial64 como base para nuestra máquina virtual.

El segundo comando, ‘vagrant up’, descarga, instala, configura y arranca la máquina virtual. Vagrant descarga las imágenes base de las máquinas virtuales. En el repositorio de boxes hay multitud de imágenes de diferentes sistemas operativos y podremos utilizar la que más se ajuste a nuestras necesidades. Estas imágenes base contienen instalaciones básicas del correspondiente sistema operativo, que Vagrant clona para crear nuestras máquinas virtuales. Gracias a este modo de funcionamiento, la creación y arranque de las máquinas virtuales es mucho más rápida y sencilla.

Una vez que el comando ‘vagrant up’ termine, tendremos la máquina virtual arrancada y lista para trabajar con ella. Por lo que será el momento de continuar con el siguiente proceso en cuestión que os vamos a explicar en las siguientes líneas.

 

Acceso a la máquina virtual

Por defecto, Vagrant inicia la máquina virtual sin interfaz gráfica. Sin embargo, podemos acceder a ella mediante SSH con el comando «vagrant ssh». Lo que nos permitirá tener acceso a la línea de comandos de la máquina virtual y podremos hacer todo lo habitual en una máquina GNU/Linux. Para que te quede más claro, este comando te da la oportunidad de establecer conexión mediante SSH a la máquina virtual que has creado.

Además, por defecto, Vagrant configura el directorio actual (el directorio desde donde se ha hecho «vagrant init» y donde está el fichero Vagrantfile) como un directorio compartido con la máquina virtual. Esto quiere decir que todos los ficheros que dejemos en ese directorio, serán accesibles por la máquina virtual y viceversa. En la máquina virtual, este directorio compartido se encuentra por defecto en la ruta ‘/vagrant’. Así pues, una vez conectados por SSH con la máquina virtual, podemos hacer:

Si ejecutamos el comando «ls», podremos ver, además, todos los ficheros del directorio compartido. Este directorio compartido es de gran utilidad, ya que si configuramos, por ejemplo, nuestra máquina virtual como un servidor web, podemos dejar en él los ficheros que queramos que el servidor procese y trabajar sobre ellos desde la máquina “host“.

 

Parando la máquina virtual

Una vez que hayamos terminado de trabajar con la máquina podemos ejecutar los siguientes comandos:

  • «vagrant suspend»: Pausa la máquina virtual, guardando el estado actual en el disco duro. Permite arrancar de nuevo la máquina muy rápidamente con «vagrant up» con el estado exacto en el que se quedó.
  • «vagrant halt»: Realiza un apagado controlado de la máquina virtual (igual a apagar una máquina física). Como en el caso anterior, podemos volver a arrancar la máquina virtual con «vagrant up», aunque en este caso el arranque es más lento que al hacer un «suspend» (ya que tiene que volver a iniciar el sistema operativo).
  • «vagrant destroy»: Destruye la máquina virtual y todo su contenido.

Como podemos observar en estas breves indicaciones Vagrant nos permite realizar entornos virtuales muy sencillos con dos o tres comandos. Ahora os vamos a enseñar cómo modificar nuestro fichero vagrantfile, para que nuestra máquina posea muchas más funcionalidades. Además, podremos combinar «vagrant» con otras herramientas para que consigamos así un entorno de desarrollo elaborado.

 

Vagrant file: archivo para configuración de máquinas virtuales con Vagrant

La configuración de un escenario concreto se realiza de forma bastante simple mediante modificaciones en este fichero, que está escrito en formato Ruby. Realmente la configuración que se aplica es la aplicación en serie de varios Vagranfiles, tal como se explica en Load Order and Merging, aunque lo más habitual es que se cargue el Vagrantfile que incluye el box y el que exista en el directorio de trabajo, siendo este último el que se modifica en la mayoría de los casos.

 

Modificaciones de la máquina virtual

Se configuran en el espacio de nombres «config.vm», prefijo que antecede a los parámetros en este caso, por ejemplo, para modificar el hostname de la máquina utilizaríamos:

config.vm.hostname = "redeszone"

El resto de parámetros que se pueden modificar los encontramos en la documentación de Vagrant: Machine Settings, dejando en nuestro caso para secciones posteriores algunos de los aspectos que necesitan más desarrollo, como la configuración de la red, o la configuración integrada de la máquina virtual mediante shell scripts o mediante aplicaciones como ansible o puppet.

Parámetros relativos a las características de hardware de la máquina virtual dependen del proveedor en Vagrant, y en el caso de VirtualBox se definen mediante una subsección, veamos de forma prácticas algunos ejemplos de configuración de los ficheros Vagrantfiles.

 

Vagrantfiles modificados para virtualización de máquinas

Realiza las modificaciones apropiadas en un Vagrantfile para cambiar el nombre de la máquina virtual, la memoria RAM asignada y el número de núcleos virtuales.

config.vm.provider «virtualbox» do |vb|

vb.name = «nombre»

vb.memory = «512»

vb.cpus = 2

end

Como la forma habitual de gestionar máquinas virtuales en Vagrant es mediante la línea de comandos, y accediendo a ellas a través de SSH, no tiene mucho sentido que se arranque una interfaz gráfica, pero en algunas ocasiones es conveniente. Modifica un fichero Vagrantfile para que se inicie la interfaz gráfica de usuario al levantar la máquina.

config.vm.provider «virtualbox» do |vb|

vb.gui = true

end

Aprovisionamiento ligero (thin provisioning) es una técnica muy utilizada en diferentes sistemas de virtualización, y consiste en crear un disco de imagen de máquina virtual que incluya sólo las modificaciones respecto a una imagen base, consiguiendo un ahorro significativo de espacio en disco a costa de una pequeña penalización en rendimiento. Configura un Vagrantfile para que se realice aprovisionamiento ligero.

config.vm.provider «virtualbox» do |vb|

vb.name = «ligera»

vb.linked_clone = true

end

Por otra parte, si se quiere ejecutar sobre una máquina el bloque de aprovisionamiento, el comando a usar es ‘vagrant provision’. Aunque la configuración completa de las redes lo dejamos para una sección posterior, una funcionalidad muy útil y sencilla es la redirección de puertos de la red por defecto que utiliza Vagrant (red interna con NAT). Configura un Vagrantfile para que las peticiones al puerto 8080/tcp de la máquina anfitriona se redirijan al puerto 80/tcp de la máquina virtual.

La documentación completa se encuentra en Forwarded Ports.

config.vm.network "forwarded_port", guest: 80, host: 8080

Podemos ver en todo momento los puertos que se has redireccionado con la instrucción:

vagrant port

Estos cambios se pueden realizar sobre una máquina ya funcionando y para que se apliquen se utiliza la opción:

vagrant reload

En algunas ocasiones, Vagrant no ofrece directamente la posibilidad de hacer cierta configuración específica en la máquina virtual, por lo que pierde parte de su atractivo, sin embargo, esto puede solucionarse utilizando comandos, en el caso de utilizar VirtualBox, incluyendo en el fichero Vagrantfile comandos de VBoxManage, como en el siguiente.

 

Configurar máquina virtual disco adicional de 500 GiB

Editamos el fichero Vagrantfile e incluímos las líneas:

config.vm.provider «virtualbox» do |vb|

file_to_disk = ‘tmp/disk.vdi’

unless File.exist?(file_to_disk)

vb.customize [‘createhd’,

‘–filename’, file_to_disk,

‘–size’, 500 * 1024]

end

vb.customize [‘storageattach’, :id,

‘–storagectl’, ‘SATAController’,

‘–port’, 1,

‘–device’, 0,

‘–type’, ‘hdd’,

‘–medium’, file_to_disk]

end

En el directorio de trabajo podremos ver que se ha creado un fichero en formato vdi.

ls -hl

-rw——-    1 alejandrojosecaraballogarcia staff 3,0M feb 14 13:50 disk.vdi

Y desde la máquina virtual veremos un disco adicional de 500GiB:

NAME   MAJ: MIN    RM   SIZE     RO     TYPE MOUNTPOINT

sda          8:0                0       40 G     0      disk

└─sda1   8:1                0        40 G     0     part                 /

sdb         8:16              0       500 G    0     disk

NOTA: Este tipo de configuraciones en las que se pone de forma explícita las características de la máquina virtual, no son ni mucho menos generales, en el caso anterior se está poniendo de forma concreta el puerto SATA al que conectar el disco y el nombre del controlador SATA, características que pueden variar de una máquina virtual a otra. Suele ser conveniente obtener previamente información de las características de la máquina virtual, que en el caso de VirtualBox se puede hacer con el siguiente comando de VBoxManage:

VBoxManage showvminfo NOMBREDELAMV

Para finalizar veremos la opción «provision», esta opción nos permite la ejecución de comandos en la terminal durante la activación de la máquina, es decir en el momento que nosotros hagamos «vagrant up» y se vayan ejecutando las configuraciones del Vagrantfile, en el momento de llegar a «provision» ejecutará estas órdenes en la terminal. Esto es útil cuando queremos levantar nuestra máquina virtual con distintos programas ya instalados, por ejemplo, podríamos poner lo necesario en provisión para que nuestra máquina virtual levante un servidor Apache.

vb.vm.provision «shell», inline: <<-SHELL

apt-get update

apt-get upgrade

apt-get install apache2 -y

SHELL

En la siguiente imagen podréis observar una configuración para una máquina virtual que actuaría como Router en una red.

No solo tenemos la opción del «provision» en algunos casos, algunas máquinas deben de ejecutar el mismo «provision» y no por ello debemos de estar repitiéndolo. Podemos crear una variable $shell con todo el «provision» y en las máquinas ejecutar dicha variable.

 

Otras funcionalidades

Otras funcionalidades de Vagrant son las siguientes:

  • Arrancar un entorno: es una de las principales características de Vagrant. Esto nos permite crear una máquina virtual en menos de un minuto. En esta también podemos implementar SSH, en cambio no podremos visualizar nada, pues esta máquina se ejecuta sin una interfaz gráfica. Este SSH nos permitirá gestionar una sesión SSH completa, de forma que podemos interactuar con la máquina y básicamente, hacer lo que queramos. Solo debemos tener cuidado con algunos comandos, pues estos comparten directorio con el directorio host, que contiene Vagrantlife, lo que puede ocasionar la pérdida de archivos.
  • Sincronización de archivos: con este entorno, podremos sincronizar de forma automática los archivos en la máquina virtual. De esta forma, se pueden editar en local y ejecutarlos en el entorno de desarrollo.
  • Compartir entornos: en el momento que tenemos un servidor web que se está ejecutando y es accesible desde la máquina, podemos disponer de un entorno de desarrollo que nos facilita compartir y colaborar con otros entornos. Esto se llama Vagrant Share. Esto quiere decir que podremos compartir el entorno con cualquier persona, a la cual daremos una URL que se enruta directamente al entorno, pudiendo conectarse desde cualquier dispositivo.
  • Reconstrucción de entornos: cuando trabajamos con este tipo de entornos, puede darse el caso de que alguno se deje de usar por un determinado periodo de tiempo. Esto no será problema, pues podremos retomarlo cuando sea necesario. Con el comando «vagrant up», este hará una recreación del mismo, y lo ejecuta.
  • Derribar entornos: una vez hemos acabado de trabajar con un determinado entorno de desarrollo, podemos detenerlo, apagarlo o directamente destruirlo. Si optamos por suspender, esta guardará el estado anterior al momento de realizar la suspensión, de esta forma al querer trabajar de nuevo con ella, hacemos un «up», y ya se ejecuta de nuevo. Si la detenemos esta se parará por completo, de forma que al iniciarla esta se ejecutará como una nueva sesión, y finalmente la destrucción, donde eliminaremos todo rastro que pueda quedar de la máquina.

Tal y como habéis visto, necesitaremos tener conocimientos básicos de bash para configurar correctamente Vagrant y automatizar todo el trabajo de crear un entorno de desarrollo portable, esta herramienta es realmente útil y utilizado ampliamente en empresas donde se hagan diferentes desarrollos.

 

Rendimiento de Vagrant

Con Vagrant es importante destacar que puede variar según diferentes factores, como las especificaciones del sistema anfitrión, la configuración de la máquina virtual y la carga de trabajo del entorno de desarrollo. Sin embargo, en general, Vagrant ofrece un buen rendimiento y puede ser una opción eficiente para la virtualización de entornos de desarrollo. De hecho, por cada una de sus características y funcionalidades se convierte en una de las opciones más completo.

Por otro lado, hay que tener en cuenta que su objetivo principal es proporcionar una configuración consistente y reproducible para los desarrolladores, permitiéndoles crear y desplegar entornos de desarrollo portátiles y escalables.

Uno de los aspectos que contribuye al rendimiento de Vagrant es su capacidad para utilizar diferentes proveedores de virtualización, como VirtualBox, VMware y Hyper-V. Estos proveedores ofrecen diferentes características y optimizaciones de rendimiento, lo que permite a los desarrolladores elegir el más adecuado para sus necesidades y requisitos específicos. Además, Vagrant implementa la virtualización ligera utilizando tecnologías como Docker y LXC, lo que permite un inicio y apagado más rápidos de las máquinas virtuales, así como un uso eficiente de los recursos del sistema. Esto se traduce en un rendimiento mejorado y una experiencia de desarrollo más fluida.

Otro aspecto a considerar es la configuración de la máquina virtual en sí. Vagrant permite personalizar diferentes aspectos de la configuración, como la asignación de recursos (CPU, memoria RAM, almacenamiento) y la configuración de red. Ajustar adecuadamente estos parámetros puede tener un impacto significativo en el rendimiento general de la máquina virtual y, por lo tanto, en el rendimiento de Vagrant.

Además, Vagrant ofrece opciones de aprovisionamiento, como Ansible, Chef y Puppet, que permiten automatizar la instalación y configuración de software en la máquina virtual. Esto contribuye a un proceso de configuración más rápido y a un mejor rendimiento, ya que evita la necesidad de realizar manualmente todas las tareas de configuración en la máquina virtual. Por lo cual estamos ante una herramienta con muy buenas capacidades.

 

Alternativas a Vagrant

Siempre que hablamos de alguna herramienta en concreto, es bueno ver cuáles son las alternativas a esta. De esta manera, se pueden tener en cuenta diferentes opciones para saber cuál es la que más se ajusta a las necesidades de cada usuario en particular.

Por lo general, Vagrant es una herramienta muy completa, pero puede ser que esta no se ajuste exactamente a lo que nosotros necesitamos. Por lo cual, en Internet nos podemos encontrar muchas alternativas donde alguna, se puede adaptar a nosotros de una forma mucho más cómoda y eficiente. No son pocas las alternativas, por lo cual es algo que requiere de un estudio previo y así, hacer la mejor elección que sea posible. Algunas de las más conocidas son:

  • JIRA: Se trata de una herramienta de desarrollo de software, considerada como el número uno dentro del sector. Es utilizada por gran cantidad de equipo, que la utilizan para realizar una planificación y construcción de sus proyectos. Sea a pequeña o gran escala. Esta nos proporciona una versión de prueba, lo cual puede ser perfecto.
  • JIRA Service Management: Estamos ante una opción muy similar a la anterior, pero más asequible. En cambio, está calificado como uno de los mejores softwares, por lo cual tiene gran popularidad entre los usuarios.
  • SpiraTeam: Se trata de un sistema de gestión del ciclo de vida de las aplicaciones. Se puede encargar de gestionar los requisitos, lanzamientos, pruebas y todos los problemas que puedan aparecer durante el proyecto.
  • Asana: Es una de las herramientas más sencillas de utilizar. Se considera una de las mejores a la hora de manejar proyectos a gran escala.
  • GitHub: Esta permite a los desarrolladores realizar una colaboración, revisión y administración mucho más eficiente. Pero esta herramienta, se suele utilizar más como un complemento a las que citamos previamente.

Como puedes ver, son muchas las posibilidades que tenemos a la hora de elegir las mejores herramientas. Lo mejor que podemos hacer, es contrastar lo que necesitamos con las funcionalidades de cada una. De esta forma, tendremos que la mejor se ajusta a nuestras necesidades.

¡Sé el primero en comentar!