Home » Crear boxes de Vagrant
boxes de vagrant con ubuntu y hyper-v

Crear boxes de Vagrant

Tenía la necesidad de crear máquinas virtuales de forma rápida y sencilla, de forma repetitiva. Qué mejor que hacerlo con Vagrant, pero en Hyper-V casi no había boxes públicos disponibles. Es así que opté por crear mi propio box.

Si eres un usuario de Vagrant y quieres saber cómo crear boxes para tu propio uso, este artículo es para ti.

Antecedentes

Vagrant es una buena herramienta que te permite automatizar la creación de máquinas virtuales para fines de desarrollo y pruebas. Soporta distintas plataformas como VirtualBox o Hyper-V, pero existe soporte para otras plataformas como VMware, Docker, AWS e incluso más.

He sido un usuario de VirtualBox en Linux y Windows por muchos años, pero por alguna extraña razón -que no pude aún comprender- empecé a tener un rendimiento muy pobre sobre plataforma Windows. Esto parecía empeorar aún más cuando lo combinaba con Vagrant, provocando muchas veces que las máquinas virtuales no arrancasen, o fallasen.

Ha sido experiencia que no recuerdo con mucho detalle (pues fue hace meses) y no tengo mucho interés en saber qué pasó. Sin embargo, creo que pudo ser algo muy particular de mi entorno (una computadora nueva que adquirí) y no generalizo como algo que siempre ha de fallar.

De hecho, por muchos años VirtualBox me funcionó perfecto tanto en Linux como en Windows.

Pero, para resumir las cosas, esta vez me animé a usar Vagrant con Hyper-V.

Introducción

En este artículo te mostraré paso a paso cómo crear tu propio box de Vagrant con Ubuntu Server sobre Hyper-V. Sin embargo, los pasos deberían ser muy similares para VirtualBox y otras distribuciones de Linux.

Implementación

1. Creación de máquina virtual Hyper-V

En Hyper-V, hay que crear una máquina virtual con el asistente paso a paso, pero asegurándonos de usar estas características:

  • Generación: 2
  • Disco: 20 GB es suficiente
  • Memoria: 2048 MB
  • Secure Boot
    • Estado: Habilitado
    • Plantilla: Microsoft UEFI Certification Authority
  • Checkpoints
    • Estado: Deshabilitado

Aquí dejo algunos pantallazos de las secciones más relevantes y el estado de configuración requerido.

Creación de máquina virtual Hyper-V de Generación 2

Secure Boot habilitado con plantilla apropiada

Checkpoints deshabilitado

El arranque debe buscar primero la unidad virtual de DVD

2. Instalación de Ubuntu

Seguir los pasos de instalación por defecto de Ubuntu Server. No hay ningún requerimiento especial en la instalación, salvo el asegurarse que sí se instale el OpenSSH Server.

3. Configuración de Ubuntu

A continuación, los pasos específicos de ajustes del sistema operativo Linux que son requeridos para crear boxes de Vagrant.

3.1. Usuario y password de vagrant

Se necesita tener un usuario de nombre vagrant y que use vagrant como contraseña.

No es requerido -pero sí recomendable- que el password de root también sea vagrant.

Así podemos lograr estos puntos:

sudo useradd -m -s /bin/bash vagrant
echo "vagrant:vagrant" | sudo chpasswd
echo "root:vagrant" | sudo chpasswd

3.2. Configuración de llaves SSH

Existen unas llaves SSH oficiales que son usadas de manera predeterminada por los boxes de Vagrant. No es indispensable usarlas, pero hacerlo facilita la compatibilidad y uso uniforme de los boxes por cualquier usuario.

Estas llaves son inseguras, pues el material privado está publicado en este enlace. Sin embargo, cuando Vagrant crea una máquina a partir de un box por primera vez, usa las llaves insegura solo al momento de inicialización para luego crear otro juego de llaves único para la máquina virtual.

En el enlace antes compartido está documentado el propósito de cada llave, pero si deseamos simplificar este paso, solo procedamos a copiar las llaves públicas de este otro enlace.

Esto lo podemos hacer posible así:

url="https://raw.githubusercontent.com/hashicorp/vagrant/main/keys/vagrant.pub"
sudo mkdir /home/vagrant/.ssh
sudo curl -o /home/vagrant/.ssh/authorized_keys "$url"
sudo chown -R vagrant:vagrant /home/vagrant/.ssh
sudo chmod -R go= /home/vagrant/.ssh

3.3. Configuración de sudo

El usuario vagrant debe tener todos los privilegios de root a través de sudo sin requerir contraseña. Para ello, hay que agregar este contenido al final del archivo /etc/sudoers

vagrant ALL=(ALL) NOPASSWD: ALL

Este archivo no debe ser editado directamente con editores como vim o nano, sino a través del comando visudo

Alternativamente, podría usarse este otro comando con cuidado:

echo "vagrant ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers

3.4. Configuración SSH

El servicio OpenSSH requiere algunos ajustes menores. Esto se hace editando el archivo /etc/ssh/sshd_config y asegurándose que las siguientes líneas existan con esos valores:

UseDNS no
PubkeyAcceptedAlgorithms +ssh-rsa

Una vez que se termine de ejecutar estos pasos, ya se puede apagar la máquina virtual.

4. Exportar máquina virtual

Con la máquina virtual apagada, ahora hay que exportarla sobre una ruta deseada, por ejemplo D:\

Exportar máquina virtual

Luego, sobre el directorio creado producto de la exportación, ubicar el directorio Snapshots y eliminarlo, pues no se necesitará.

Eliminación de directorio Snapshots

5. Configuración de metadata

Dentro del directorio creado (D:\ubuntu-vagrant) se debe crear un archivo llamado metadata.json con un contenido como este:

{
  "provider": "hyperv"
}

6. Creación del box

Crear el box de Vagrant implica empaquetar y comprimir el contenido del directorio creado en la exportación de la máquina virtual (D:\ubuntu-vagrant), sin incluir el nombre del directorio contenedor en sí.

Desde la línea de comandos se puede realizar esto como sigue:

cd D:\ubuntu-vagrant
tar -czvf D:\ubuntu-vagrant.box ./*

Ejecutar tar desde Windows requiere tener instalado los utilitarios UNIX para Windows, el cual suele venir incluido en Git para ese sistema operativo. Alternativamente, también se puede crear el archivo con el programa 7-zip.

7. Importar el box

El paso anterior ha creado el box en un archivo local que es D:\ubuntu-vagrant.box, pero este debe ser importado a Vagrant para poder usarlo. Esto lo hacemos como sigue:

vagrant box add --name arengifoc/noble64 D:\ubuntu-vagrant.box

El argumento del parámetro --name puede ser cualquier valor que deseemos, pero me pareció adecuado nombrarlo con mi nombre de usuario en GitHub como prefijo (arengifoc), luego el separador / y finalmente el nombre del release de Ubuntu (noble) y la arquitectura (64 por 64-bits). Este mismo formato es el que usan los boxes públicos disponibles en la página oficial de búsqueda de boxes de Vagrant.

Luego, verificamos que el box exista:

vagrant box list

8. Uso del box en Vagrant

Finalmente, ya podemos crear la primera máquina virtual basado en el box personalizado que hemos creado.

En un directorio vacío, inicializamos el Vagrantfile como sigue:

vagrant init arengifoc/noble64

Este comando crea un archivo Vagrantfile con contenidos predeterminados y muchos comentarios. Me parece mejor si borramos todo y lo dejamos con este modelo mínimo funcional:

Vagrant.configure("2") do |config|
  config.vm.box              = "ubuntu/noble64"
  config.vm.box_check_update = false

  # Decision personal: deshabilitar la comparticion de folders
  config.vm.synced_folder ".", "/vagrant", disabled: true

  config.vm.provider "hyperv" do |hv|
     hv.vmname = "my-vagrant-01"
     hv.cpus   = 2
     hv.memory = 2048
  end
end

9. Permisos de llave SSH (solo Windows)

Windows tiene una particularidad con las llaves SSH y el uso del cliente SSH predeterminado del sistema operativo: los permisos por defecto son muy permisivos y no permiten su uso.

Esto se corrige con una pequeña secuencia de script como la siguiente:

# Busca el archivo private_key dentro del directorio actual
$keypath = (Get-ChildItem -Recurse -Filter private_key).FullName

# Resetear los permisos por defecto
icacls.exe $keypath /reset

# Dar permisos completos solo a nuestro usuario
icacls.exe $keypath /GRANT "$($env:USERNAME):(F)"

# Deshabilitar los permisos heredados
icacls.exe $keypath /inheritance:r

Luego de esto, ya podemos iniciar la máquina virtual y conectarnos a ella:

vagrant up

vagrant ssh

Importante: En la primera vez que arranca una máquina virtual luego de su creación, Vagrant nos preguntará qué Virtual Switch deseamos utilizar. Esto se debe a que el provider de Vagrant para Hyper-V no soporta las configuraciones automáticas de red, razón por la cual se nos pregunta ello y por lo mismo no es posible configurar una IP estática a las máquinas virtuales desde el archivo Vagrantfile

Esto está documentado en este enlace oficial

Conclusión

Este ha sido un artículo técnico bastante detallado, paso a paso, para crear boxes en Vagrant usando Hyper-V como hipervisor y el sistema operativo Ubuntu.

Si alguien está interesado en realizar los mismos pasos para CentOS u otro sistema Linux, fácilmente podrá darse cuenta que los pasos son exactamente los mismos.

Espero que les haya sido de utilidad esta guía. Nos vemos en la próxima.

Post navigation

Deja un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *