Gestionando máquinas virtuales con Vagrant

5 minuto de lectura

Vagrant es una aplicación libre desarrollada en ruby que nos permite crear y personalizar entornos de desarrollo livianos, reproducibles y portables. Vagrant nos permite automatizar la creación y gestión de máquinas virtuales. Las máquinas virtuales creadas por vagrant se pueden ejecutar con distintos gestores de máquinas virtuales (VirtualBox, VMWare, KVM,…), en nuestro ejemplo vamos a usar máquinas virtuales en VirtualBox.

El objetivo principal de vagrant es aproximar los entornos de desarrollo y producción, de esta manera el desarrollador tiene a su disposición una manera  muy sencilla de desplegar una infraestructura similar a la que se va a tener en entornos de producción. A los administradores de sistemas les facilita la creación de infraestrucutras de prueba y desarrollo.

Para más información tienes a tu disposición toda la documentación en su página oficial: http://www.vagrantup.com/

Instalación

En el presente articulo vamos a explicar el funcionamiento de vagrant. Para ello vamos a usar un sistema operativo GNU Linux Debian Wheezy, donde tenemos instalado VirtualBox.

Para instalar  vagrant nos bajamos la última versión desde la página (http://downloads.vagrantup.com/</a>). En el momento de escribir este artículo la versión era la 1.3.1, y al estar trabajando con Debian nos bajamos el paquete deb y lo instalamos:

wget http://files.vagrantup.com/packages/b12c7e8814171c1295ef82416ffe51e8a168a244/vagrant_1.3.1_x86_64.deb
$ dpkg -i vagrant_1.3.1_x86_64.deb

Una vez instalado podemos comprobar la versión que hemos instalado con:

vagrant -v
Vagrant 1.3.1

Boxes

Un box es una máquina virtual empaquetada. Posteriormente al crear una máquina virtual habrá que indicar de que box se va a clonar. Vagrant proporciona algunos boxes oficiales, aunque podemos encontrar un listado no oficial en http://www.vagrantbox.es.

Para poder utilizar un box es necesario agregarlo a nuestro repositorio de boxes, para ello utilizo la siguiente instrucción:

vagrant box add {title} {url}

Por lo que ejecutamos con nuestro usuario sin privilegios la siguiente instrucción, nos vamos a bajar un box de una distribución Ubuntu Precise de 32 bits:

$ vagrant box add precise32 http://files.vagrantup.com/precise32.box

El box se habrá guardado en /home/usuario/.vagrant.d/boxes.

Podemos ver la lista de boxes que tenemos en nuestro repositorio con la instrucción:

$ vagrant box list

Vagrantfile: configurando nuestro escenario

Para configurar las máquinas virtuales que vamos a desplegar usamos un fichero de configuración Vagranfile. El fichero Vagrantfile describe una o varias instancias para crear un entorno vagrant en el directorio en el que se este trabajando. Por lo tanto se pueden tener varios Vagranfile en diferentes directorios.

Un ejemplo de un fichero Vagranfile podría ser:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
               config.vm.box = "precise32"
               config.vm.network :private_network, ip: "10.1.1.2"
end

Podemos crear un fichero Vagrantfile mínimo de la siguiente forma:

$ mkdir escenario
$ cd escenario
~/escenario$ vagrant init

Configuración del fichero Vagrantfile

En el fichero Vagrantfile podemos indicar la configuración de varias máquinas virtuales, las opciones más comunes que podemos configurar son las siguientes:

  • vm.box, con esta opción elegimos el box de nuestro repositorio del que se va a crear la máquina virtual.

    Por ejemplo:

      config.vm.box = "precise32"
    
  • vm.hostname, indicamos el nombre de la máquina virtual. Es recomendable que si vamos a trabajar con varias máquinas virtuales, le asignemos un nombre significativo.

    Por ejemplo:

      config.vm.hostname = "servidor_web"
    
  • vm.network, nos permite indicar la configuración de red de la máquina virtual.

    Veamos algunos ejemplos:

      config.vm.network :public_network,:bridge=>"eth0"
    

    Configura una tarjeta de red en modo Adaptador puente de VirtualBox, indicando la interfaz de red que usa en el anfitrión para ello.

      config.vm.network :private_network, ip: "172.22.100.3"
    

    Configura una tarjeta de red en modo Red interna de VirtualBox, indicando la ip que va a tener la máquina.

    Podemos indicar varios parámetros vm.network, con lo que estaríamos definiendo varios interfaces de red en la máquina virtual.

Para terminar, indicar que tenemos más parámetros de configuración que nos permiten configurar otros aspectos de la máquina virtual, como tamaño de la memoria RAM, o núcleos asignados del procesador. Para más información accede a http://docs.vagrantup.com/v2/.

Configurando varias máquinas virtuales

Los parámetros que hemos estudiado anteriormente se pueden utilizar para configurar varias máquinas virtuales. En el siguiente fichero de configuración Vagrantfile vemos como se definen dos máquinas virtuales: nodo1 y nodo2 con configuraciones diferentes:

# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.define :nodo1 do |nodo1|
    nodo1.vm.box = "precise32"
    nodo1.vm.hostname = "nodo1"
    nodo1.vm.network :private_network, ip: "10.1.1.101"

  config.vm.define :nodo2 do |nodo2|
    nodo2.vm.box = "precise32"
    nodo2.vm.hostname = "nodo2"
    nodo2.vm.network :public_network,:bridge=&gt;"wlan0"
  end
end

Gestión de las máquinas virtuales

Una vez que tenemos nuestras máquinas virtuales configuradas, es hora de trabajar con ellas, para ello tenemos varios comandos que vamos a estudiar.

  • vagrant up, nos permite arrancar las una clonación desde el box, y se realizará la configuración. Si las máquinas ya han sido creadas, pero están suspendidas, se vuelven a arrancar.

    Ejemplo:

      ~/escenario$ vagrant up 
      Bringing machine 'nodo1' up with 'virtualbox' provider...
      Bringing machine 'nodo2' up with 'virtualbox' provider...
      [nodo1] Importing base box 'precise32'...
      [nodo1] Matching MAC address for NAT networking...
      [nodo1] Setting the name of the VM...
      ...
    
  • Para acceder a las máquinas por ssh podemos utilizar la instrucción vagrant ssh donde indicamos el nombre de la máquina donde queremos acceder.

      ~/escenario$ vagrant ssh nodo1
      Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
       * Documentation:  https://help.ubuntu.com/
      Welcome to your Vagrant-built virtual machine.
      Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2
      vagrant@nodo1:~$
    
  • Si queremos detener una máquina utilizamos la instrucción vagrant halt:

      ~/escenario$ vagrant halt nodo1
      [nodo1] Attempting graceful shutdown of VM...
    
  • Por último si queremos destruir todas las máquinas virtuales de un entorno vagrant utilizamos la instrucción vagrant destroy:

      ~/escenario$ vagrant destroy
      Are you sure you want to destroy the 'nodo2' VM? [y/N] y
      [nodo2] Forcing shutdown of VM...
      [nodo2] Destroying VM and associated drives...
      Are you sure you want to destroy the 'nodo1' VM? [y/N] y
      [nodo1] Forcing shutdown of VM...
      [nodo1] Destroying VM and associated drives...
    

Conclusiones

Vagrant es un software muy nuevo, en pleno desarrollo que nos ofrece una forma muy sencilla de construir máquinas virtuales con distintas configuraciones de red. Por supuesto, este artículo ha sido sólo una introducción y la herramienta ofrece muchas más opciones. Una de las más interesantes, y que abordaré en otro artículo, es la posibilidad de combinarla con herramientas de orquestación como puppet, chef o ansible que nos permiten interactuar con las máquinas que hemos desplegado. Pero esto lo dejamos para más adelante.

Comentar