Crear boxes de Vagrant
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.
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:\
Luego, sobre el directorio creado producto de la exportación, ubicar el directorio Snapshots y eliminarlo, pues no se necesitará.
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.
Deja un comentario