Vagrant

Vagrant

La configuración de red que nos da Vagrant no es transparente y puede tomar por sorpresa a nuevos usuarios.

¿Qué es Vagrant?

Vagrant es un programa hecho por HashiCorp que permite generar ambientes para desarrollo o pruebas de una manera rápida, eficaz y reproducible. Estos ambientes comúnmente son máquinas virtuales, aunque en la actualidad se pueden generar contenedores para probar nuestro software de una manera más ágil.

Se puede definir a Vagrant como un meta manejado, porque se comunica con los programas que manejan las máquinas virtuales o contenedores, coordina su ejecución y brinda una interfaz estándar para interactuar con los ambientes sin importar la tecnología sobre la que se monten ni el sistema operativo anfitrión que se tenga en el equipo físico.

Configuración de Vagrant

Vagrant denomina a las máquinas virtuales o contenedores que va a ejecutar como cajas (boxes). La configuración de cada caja está definida en un archivo llamado Vagrantfile que utiliza el lenguaje de programación Ruby. Esta publicación se centra en el uso de Vagrant con máquinas virtuales.

¿Qué proveedores existen en Vagrant?

Los proveedores de vagrant son los programas que pueden ejecutar máquinas virtuales y contenedores (denominados cajas o boxes) dentro del equipo físico. Vagrant coordina la ejecución de las cajas a través de cada proveedor.

Los siguientes proveedores vienen incluidos:

Existen otros proveedores adicionales como:

  • VMware para Workstation (Linux / Windows) o Fusion (macOS)
  • LXC para GNU/Linux
  • libvirt para GNU/Linux

Instalación de Vagrant

Vagrant puede ejecutarse en GNU/Linux, macOS y Windows. Debe existir algún programa manejador de máquinas virtuales o contenedores instalado en el equipo físico antes de que Vagrant pueda ser instalado. Esta publicación asume que VirtualBox está instalado en el equipo.

Para instalar Vagrant se debe descargar el programa de instalación para el sistema operativo que se tenga en el equipo físico.

Debian GNU/Linux

Para instalarlo en Debian, Ubuntu o derivados, se agrega la llave GPG para validar los paquetes.

# curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add -

En caso de no tener curl instalado, esto también se puede hacer con wget.

# wget -qc -O - https://apt.releases.hashicorp.com/gpg | apt-key add -

Después se agrega el repositorio de apt. Esto se puede hacer de dos maneras diferentes:

  • Utilizando el programa apt-add-repository
  • Editando el archivo de repositorio
Utilizando apt-add-repository
# apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
Editando el archivo de repositorio
# echo "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/vagrant.list

Después de agregar la configuración del repositorio, se actualiza la lista de paquetes disponibles.

# apt -q update
	...
Get:5 https://apt.releases.hashicorp.com buster InRelease [4421 B]
Get:6 https://apt.releases.hashicorp.com buster/main amd64 Packages [28.4 kB]
	...

Una vez actualizada la lista de paquetes, se instala vagrant con apt.

# apt install vagrant

Primeros pasos con Vagrant

El mecanismo principal de interacción con Vagrant es utilizando la herramienta de línea de comandos vagrant.

Inicializar la configuración de la máquina virtual

Para lanzar una instancia de una máquina virtual se crea un directorio vacío y se inicializa la configuración utilizando el comando vagrant init.

$ mkdir alpine
$ cd alpine
$ vagrant init alpine/alpine64
A `Vagrantfile` has been placed in this directory.
You are now ready to `vagrant up` your first virtual environment!
Please read the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Esto crea el archivo Vagrantfile con la configuración de la máquina virtual.

$ ls -lA
total 4
-rw-r--r-- 1 tonejito wheel 3021 Jul 23 16:04 Vagrantfile

El archivo de configuración contiene muchos comentarios, pero esencialmente tiene la información de la imágen que se usa para ejecutar la instancia de la máquina virtual:

$ egrep -v '^\s*(#|$)' Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "alpine/alpine64"
end

Lanzar la máquina virtual

Se utliza el comando vagrant up para ejecutar la máquina virtual en el equipo.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'alpine/alpine64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'alpine/alpine64' version '3.7.0' is up to date...
==> default: Setting the name of the VM: alpine_default_1627074511092_9334
==> default: Fixed port collision for 22 => 2222. Now on port 2201.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2201 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2201
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection reset. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.1.30 r118389
    default: VirtualBox Version: 6.1
==> default: Mounting shared folders...
    default: /vagrant => /private/tmp/alpine
Inspeccionar la configuración de la máquina virtual

Se puede inspeccionar la configuración de la máquina virtual desde la consola de VirtualBox o bien desde la línea de comandos. Cada máquina virtual tiene un nombre y un identificador único UUID.

$ vboxmanage list runningvms
"alpine_default_1627074511092_9334" {de2d1bd5-55b7-430c-8471-391e59266618}

Se puede utilizar el UUID para inspeccionar la configuración de la máquina virtual.

$ export VM_UUID=de2d1bd5-55b7-430c-8471-391e59266618

$ vboxmanage showvminfo ${VM_UUID}
Name:                        alpine_default_1627074511092_9334
Groups:                      /
Guest OS:                    Linux 2.6 / 3.x / 4.x (64-bit)
UUID:                        de2d1bd5-55b7-430c-8471-391e59266618
Config file:                 /Users/tonejito/VirtualBox VMs/alpine_default_1627074511092_9334/alpine_default_1627074511092_9334.vbox
Snapshot folder:             /Users/tonejito/VirtualBox VMs/alpine_default_1627074511092_9334/Snapshots
Log folder:                  /Users/tonejito/VirtualBox VMs/alpine_default_1627074511092_9334/Logs
Hardware UUID:               de2d1bd5-55b7-430c-8471-391e59266618
Memory size:                 512MB
	...
Number of CPUs:              1
	...
State:                       running (since 2021-07-23T21:08:35.757000000)
	...
SATA (0, 0): /Users/tonejito/VirtualBox VMs/alpine_default_1627074511092_9334/box-disk001.vmdk (UUID: c701a19a-32f3-4b96-8fe6-70c6ac13d987)
NIC 1:                       MAC: 0800279E9EE5, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82545EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
NIC 1 Rule(0):   name = ssh, protocol = tcp, host ip = 127.0.0.1, host port = 2201, guest ip = , guest port = 22
NIC 2:                       disabled
NIC 3:                       disabled
NIC 4:                       disabled
	...

Shared folders:

Name: 'vagrant', Host path: '/private/tmp/alpine' (machine mapping), writable

	...

Conectarse a la máquina virtual mediante SSH

Para establecer una conexión a la máquina virtual se ejecuta el comando vagrant ssh. Esto hace una conexión mediante SSH con el usuario vagrant y un par de llaves SSH generado específicamente para conectarse a esta máquina virtual.

$ vagrant ssh

	...

alpine:~$

Módulos de kernel de VirtualBox

Las máquinas virtuales de Vagrant pueden tener instaladas las utilerías de VirtualBox para hacer que la experiencia de uso sea mejor. Se puede verificar que la máquina virtual tiene los módulos de kernel que forman parte de la utilerías de VirtualBox.

alpine:~# lsmod | grep vbox
vboxsf                 43377  1
vboxguest             287321  1 vboxsf

La manera de instalar y configurar las utilerías de VirtualBox queda fuera del alcance de esta publicación.

Carpetas compartidas de vagrant

Al iniciar la máquina virtual una de las últimas operaciones que se realizan es compartir la el directorio actual de trabajo con la máquina virtual. Este directorio se monta en la ruta /vagrant utilizando la funcionalidad de carpetas compartidas de VirtualBox y resulta súmamente útil para ambientes de desarrollo o pruebas.

==> default: Mounting shared folders...
    default: /vagrant => /private/tmp/alpine

Cualquier archivo que se agregue a la carpeta de trabajo se compartirá de manera automágica con la máquina virtual. No todas las máquinas virtuales soportan esta funcionalidad, ej. la imágen mínima de Debian debian/buster64 no tiene instaladas las utilerías de VirtualBox, pero hay una imágen un poco más grande que si las tiene (debian/contrib-buster64).

Si se tiene el siguiente script en la carpeta de trabajo ~/Documents/vagrant/alpine.

tonejito@equipo-fisico:~$ cat hola.sh
#!/bin/sh

cat << EOF
¡Hola mundo!
Mi plataforma actual es:
$(uname -a)
EOF

Después de entrar a la máquina virtual ejecutando vagrant ssh se puede listar el contenido del directorio /vagrant y ejecutar el script.

alpine:~$ ls -lA /vagrant
total 8
drwxr-xr-x    1 root     root           128 Jul 23 21:08 .vagrant
-rw-r--r--    1 root     root          3064 Jul 23 21:25 Vagrantfile
-rwxr-xr-x    1 root     root            99 Jul 23 21:47 hola.sh

alpine:~$ /vagrant/hola.sh
¡Hola mundo!
Mi plataforma actual es:
Linux alpine 4.9.73-0-virthardened #1-Alpine SMP Tue Jan 2 16:48:59 UTC 2018 x86_64 Linux

Se puede verificar si la máquina virtual tiene montada la carpeta compartida de vagrant con el siguiente comando.

alpine:~# mount | egrep 'vagrant|vbox(sf)?'
vagrant on /vagrant type vboxsf (rw,nodev,relatime)

Elevación de privilegios

El usuario vagrant puede ejecutar el comando sudo para elevar privilegios a root sin necesidad de introducir una contraseña.

alpine:~$ whoami
vagrant

alpine:~$ sudo -i

alpine:~# whoami
root

Configuración de parámetros de la máquina virtual

Cada proveedor de vagrant tiene distintos parámetros para configurar los attributos específicos del manejador de máquinas virtuales o contenedores. Para cambiar la cantidad de memoria RAM o número de vCPU que tiene la máquina virtual se edita el archivo Vagrantfile.

  config.vm.provider "virtualbox" do |vb|
    # Customize the amount of memory on the VM
    vb.memory = 1024

    # Set the number of vCPUs in the VM
    vb.cpus = 2
  end

Configuración específica de VirtualBox

Existen ciertos parámetros de configuración que son específicos del proveedor (en este caso VirtualBox) y deben ser configurados utilizando llamadas a vboxmanage modifyvm.

  config.vm.provider "virtualbox" do |vb|
    #	...

    # Set default nic type
    vb.default_nic_type = "virtio"

    # Set CPU execution cap
    vb.customize ["modifyvm", :id, "--cpuexecutioncap", "99"]

    # Enable DNS proxy in NAT mode
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
  end

Avatar
Andrés Hernández
Mentor académico

Soy un ingeniero en computación con más de 10 años de experiencia y un fuerte interés en los sistemas operativos de tipo UNIX, redes, seguridad informática y las tecnologías de software libre y de código abierto.

Relacionado