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.

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.

Primeros pasos con Vagrant

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

El primer paso, como es habitual, es descargar e instalar Vagrant, 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. 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.

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.

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

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.

Configuremos una máquina virtual que tenga un 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.