En muchos de mis proyectos personales es fundamental poder recrear ambientes de desarrollo de forma reproducible, garantizando que las pruebas y despliegues se realicen sobre entornos consistentes.
Durante años he utilizado Vagrant como pieza central en mis flujos de trabajo. Su flexibilidad de configuración y capacidad de automatización en el aprovisionamiento de entornos me han permitido definir múltiples escenarios de prueba sin esfuerzo.
Problema: Soporte limitado de proveedores
Por alguna razón, Ubuntu unicamente ofrece Vagrant boxes oficiales para VirtualBox, excluyendo Libvirt de su lista de proveedores soportados.
Esta limitante me llevó a buscar alternativas como las ofrecidas por Lavabit, que durante mucho tiempo mantuvo un catálogo amplio de boxes compatibles tanto con VirtualBox como con Libvirt.
Sin embargo, en los últimos años la liberación de nuevas versiones en Lavabit se ha estancado, resultando en:
- Boxes obsoletos o desactualizadas.
- Descargas pesadas que incrementan los tiempos de aprovisionamiento.
- Mayor consumo de red durante las actualizaciones.
Solución: Crear un repositorio local de Vagrant Boxes
Para resolver estos inconvenientes, recientemente he configurado un repositorio local de Vagrant Boxes que almacena imágenes generadas manualmente para Ubuntu, con soporte tanto para Libvirt como para VirtualBox.
Esta solución permite:
- Controlar completamente las versiones utilizadas.
- Optimizar el tiempo de aprovisionamiento.
- Integrar fácilmente los boxes dentro de pipelines de CI/CD.
A continuación, detallo los pasos necesarios para crear este repositorio, los archivos de configuración requeridos y cómo pueden consumirse en entornos de integración continua.
Instalación de Requerimientos (Ubuntu 22.04+)
Antes de comenzar a generar y publicar los Vagrant boxes, es necesario preparar el entorno base con las herramientas necesarias.
1. Actualizar el sistema
sudo apt update && sudo apt upgrade -y
2. Instalar dependencias básicas
sudo apt-get install -y -qq curl wget gnupg lsb-release dkms apt-transport-https ca-certificates software-properties-common
3. Instalar VirtualBox
sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 gnupg
sudo mkdir -p /usr/share/keyrings
sudo gpg --dearmor --yes < oracle_vbox.asc | sudo tee /usr/share/keyrings/oracle-virtualbox-2016.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] \
http://download.virtualbox.org/virtualbox/debian ${VERSION_CODENAME:-jammy} contrib" \
| sudo tee /etc/apt/sources.list.d/virtualbox.list 2>/dev/null
sudo apt-get update
sudo apt-get install -y -qq -o=Dpkg::Use-Pty=0 VirtualBox-7.2 dkms
4. Instalar HashiCorp Packer y dependencias de virtualización
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" -y
sudo apt update
sudo apt-get --assume-yes install packer qemu qemu-kvm apache2
5. Instalar plugins de Packer para múltiples proveedores
packer plugins install github.com/hashicorp/qemu
packer plugins install github.com/hashicorp/hyperv
packer plugins install github.com/hashicorp/docker
packer plugins install github.com/hashicorp/vmware
packer plugins install github.com/hashicorp/vagrant
packer plugins install github.com/hashicorp/parallels
packer plugins install github.com/hashicorp/virtualbox
Construcción de Boxes Personalizadas
Con todas las dependencias instaladas, el siguiente paso es descargar el proyecto robox el cual contiene configuraciones predefinidas para múltiples proveedores y distribuciones.
En mi caso, utilizo una copia actualizada alojada en mi propio repositorio.
El proyecto incluye el script build.sh, responsable de generar y desplegar los Vagrant boxes en el servidor web local.
Este script ejecuta internamente ./robox.sh, iniciando el proceso de reconstrucción de imágenes. Durante la ejecución:
- El progreso se registra en la carpeta
log/. - Las imágenes generadas se almacenan temporalmente en
output/.
Finalmente, build.sh mueve las imágenes hacia /var/www/html/ y crea el archivo metadata.json necesario para su importación:
sudo tee "/var/www/html/$user/$vagrant_box/metadata.json" <<EOT
{
"name": "$user/$vagrant_box",
"description": "${descriptions[$vagrant_box]}",
"versions": [
{
"version": "$version",
"providers": [
{
"name": "libvirt",
"url": "http://nuc10-node06/$user/$vagrant_box/$user-$vagrant_box-libvirt-x64-.box",
"checksum_type": "sha256",
"checksum": "$(cat "output/$user-$vagrant_box-libvirt-x64-.box.sha256" | awk '{ print $1}')",
"architecture": "amd64",
"default_architecture": true
},
{
"name": "virtualbox",
"url": "http://nuc10-node06/$user/$vagrant_box/$user-$vagrant_box-virtualbox-x64-.box",
"checksum_type": "sha256",
"checksum": "$(cat "output/$user-$vagrant_box-virtualbox-x64-.box.sha256" | awk '{ print $1}')",
"architecture": "amd64",
"default_architecture": true
}
]
}
]
}
EOT
Consumo de los Vagrant Boxes desde el repositorio local
Una vez que los Vagrant boxes han sido generados y desplegados en el servidor local, pueden consumirse fácilmente a través de los comandos estándar de importación de imágenes de Vagrant.
Por ejemplo, para agregar un box basado en VirtualBox:
vagrant box add --provider virtualbox http://nuc10-node06/generic/ubuntu2204/metadata.json
Este comando descarga los metadatos y la imagen correspondiente desde el repositorio local, registrándola como un recurso disponible para nuevos entornos.
De esta forma, cualquier equipo dentro de la red puede aprovisionar entornos de desarrollo o prueba sin depender de fuentes externas ni de una conexión a Internet.
Beneficios de mantener un repositorio local de Vagrant Boxes
Implementar un repositorio privado de Vagrant Boxes aporta ventajas claras tanto en rendimiento como en control operativo:
- Reducción de dependencia externa dado que elimina la necesidad de descargar imágenes desde Lavabit o Vagrant Cloud.
- Evita interrupciones por cambios o eliminación de imágenes remotas.
- Acelera el tiempo de provisión, al obtener los boxes desde una fuente interna.
- Versiona tus entornos de desarrollo y producción de forma controlada.
- Reduce el tráfico externo y la carga de red hacia internet.
- Facilita la creación de ambientes air-gapped (sin conexión externa), útiles en entornos de alta seguridad.
Conclusión
Montar un repositorio privado de Vagrant Boxes no solo mejora la eficiencia en los entornos de desarrollo, sino que también incrementa la estabilidad, control y reproducibilidad de los despliegues.
Esta práctica se integra fácilmente en pipelines de CI/CD, asegurando que cada entorno sea idéntico y predecible, sin depender de recursos externos que puedan cambiar o desaparecer.
Además, recrear periódicamente los Vagrant boxes permite reducir el tráfico de red y acelerar las tareas de validación y pruebas automatizadas ejecutadas por los sistemas de integración continua.