Crear de forma sencilla y rápida máquinas virtuales de VirtualBox con Vagrant

Escrito por el .
planeta-codigo programacion software
Comentarios

Vagrant
HashiCorp

VirtualBox es una de las herramientas que permiten virtualizar un sistema operativo completo y sus aplicaciones dentro de otra máquina. Como es un sistema operativo completo requiere que el sistema que la alberga tenga RAM suficiente para sí mismo y RAM suficiente para el sistema virtualizado, se puede configurar la cantidad de RAM y almacenamiento persistente de la máquina virtual. En el proceso de virtualización se pierde algo de rendimiento por la sobrecarga que añade virtualizar un sistema operativo completo, los procesadores modernos ofrecen soporte para que el rendimiento sea lo mayor posible pero no es igual a ejecutar el sistema de forma nativa en el sistema, sobre todo en el aspecto de interfaces gráficas y aceleración 2D y 3D.

La virtualización es una buena forma de probar una distribución GNU/Linux para evaluarla o ejecutar Windows en un Linux. Hay otras herramientas de virtualización como QEMU y KVM pero la virtud de VirtualBox es que es muy sencilla y está disponible para Windows, GNU/Linux y macOS.

VirtualBox

Para tener una máquina virtual el proceso se puede hacer desde el principio desde el medio de instalación ofrecido siguiendo los de su instalador. Pero para hacer alguna prueba de desarrollo y si se necesitan virtualizar varias máquinas el proceso manual es incómodo además de repetitivo. Vagrant es una de las herramientas ofrecidas por HashiCorp que permite automatizar la creación y aprovisionamiento de máquinas virtuales en VirtualBox mediante la especificación de un archivo de configuración. Permite replicar entornos y crear un cluster de máquinas que resulta muy útil al desarrollar o probar cierto software.

En este ejemplo se configura una máquina virtual usando como sistema operativo base Ubuntu 18.04, y se aprovisiona configurando ella Docker. El aprovisionamiento se realiza mediante una serie de comandos y archivos que se añaden del host al sistema virtualizado tal como se hace en un sistema Ubuntu desde su estado de instalación inicial. Entre las opciones de configuración permitidas están el nombre de la máquina virtual, su sistema operativo, la cantidad de memoria que se le asigna, propiedades de red, asignar direcciones IP estáticas, …

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# -*- mode: ruby -*-
# vi: set ft=ruby :

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

  config.vm.define "ubuntu-docker" do |instance|
    instance.vm.box = "ubuntu/bionic64"

    instance.vm.provider :virtualbox do |vb|
      vb.name = "Ubuntu Docker (Vagrant)"
    end

    instance.vm.network "private_network", ip: "192.168.33.10"

    instance.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"

      instance.vm.provision "file", source: "docker-compose.yml", destination: "/home/vagrant/docker-compose.yml"
      instance.vm.provision "shell", inline: $docker_role_script
    end
  end

  $docker_role_script = <<-SCRIPT
    echo "Updating..."
    sudo apt-get update
    sudo apt-get upgrade

    echo "Installing docker..."
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo apt-key fingerprint 0EBFCD88
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    sudo usermod -aG docker vagrant

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    echo "Starting Docker service..."
    sudo systemctl daemon-reload
    sudo systemctl enable docker.service
    sudo systemctl start docker.service
  SCRIPT
end

Se puede crear un archivo inicia con comentarios para empezar a configurar la máquina virtual.

1
2
$ vagrant init ubuntu/bionic64
 

Definido el archivo de configuración para Vagrant se inician las máquina virtual con un comando. Y se detienen con otro. Si hay necesidad en el mismo archivo se pueden definir varias máquinas virtuales.

1
2
$ vagrant up
$ vagrant halt
VirtualBox Vagrant VM

Una vez iniciada la máquina virtual Vagrant configura SSH para tener acceso a su terminal, hay que especificar el nombre de la máquina virtual.

1
2
$ vagrant ssh ubuntu-docker
 
Vagrant SSH

La máquina en el ejemplo ha sido aprovisionada con Docker mediante un script con los comandos para instalarlo y un archivo de Docker Compose con un servicio del servidor web nginx. Desde la terminal de la máquina virtual se inicia el servicio con Docker que queda accesible tanto desde la pripia máquina virtual como desde el host indicando la dirección IP que se le ha asignado.

docker-compose up y curl desde la MV y desde el host

Vagrant tiene un repositorio de imágenes entre las que elegir para el sistema, están las más populares como Ubuntu, Fedora, Debian y CentOS. Es un repositorio en donde los usuarios pueden subir sus propias imágenes aunque por defecto es mejor usar las oficiales de cada sistema.

Posee varias páginas de documentación bastante completas donde conocer los todos los detalles de uso de Vagrant.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando vagrant up.