Antes de que una máquina virtual pueda ejecutar un script de aprovisionamiento por SSH, primero debe existir en el hipervisor, y su sistema operativo debe ser capaz de arrancar. Para entender cómo se automatiza esto, hay que desmontar un mito: las interfaces gráficas de los hipervisores son solo un adorno.
Cualquier acción que realizas haciendo clic en la interfaz de VMware, VirtualBox o Proxmox, por detrás se traduce en la ejecución de comandos en un lenguaje de programación o CLI nativo propio de ese hipervisor, o en peticiones a su API interna.
Las herramientas de Infraestructura como Código (IaC) orientadas a la creación de infraestructura (como Packer o los providers de Terraform/OpenTofu) no reinventan la rueda: son "wrappers" (envoltorios) de alto nivel. Lo que hacen es exponer una API limpia (a través de archivos de configuración declarativos como YAML o HCL) que, al ejecutarse, traduce tus deseos en el lenguaje nativo del hipervisor para controlar la creación de la máquina, y posteriormente "envuelve" scripts de Bash/PowerShell para el aprovisionamiento.
Para entender qué hace un wrapper de IaC, primero debemos ver qué comandos nativos tendría que ejecutar un humano en la terminal del hipervisor para crear una máquina virtual básica:
**En VirtualBox (CLI nativo: VBoxManage):**Bash
VBoxManage createvm --name "DebianServer" --register
VBoxManage modifyvm "DebianServer" --memory 2048 --cpus 2 --nic1 nat
VBoxManage storageattach "DebianServer" --storagectl "SATA" --port 0 --device 0 --type dvddrive --medium /path/to/debian.iso
VBoxManage startvm "DebianServer"
**En Proxmox VE (CLI nativo: qm):**Bash
qm create 101 --name "DebianServer" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
qm set 101 --ide2 local:iso/debian.iso,media=cdrom
qm start 101
Cuando utilizas un provider de Terraform para Proxmox o VirtualBox, tú escribes código limpio en HCL, pero el provider (escrito normalmente en Go) traduce ese código en secuencias de comandos qm o peticiones HTTP a la API de Proxmox.
Una vez que el wrapper ha creado el "cascarón" (la máquina virtual vacía) y ha montado la ISO, se presentan dos estrategias tecnológicas para instalar el sistema operativo:
Muchas tecnologías de IaC evitan tener que instalar el sistema operativo desde cero utilizando imágenes que ya han pasado por ese proceso y están "congeladas".
.box), que son discos virtuales comprimidos (en formato VMDK, VDI o QCOW2) que ya tienen un Debian o Ubuntu completamente instalado y configurado con el usuario vagrant.cloud-init leen los metadatos de la plataforma para cambiar la contraseña o añadir llaves SSH sin reinstalar nada.Cuando necesitas compilar tu propia imagen corporativa desde una ISO limpia y oficial (por ejemplo, usando Packer), no puedes usar cloud-init ni imágenes prefabricadas. Necesitas que el instalador de la ISO lea tu archivo de automatización (preseed.cfg para Debian o user-data para Ubuntu Autoinstall).
¿El problema? Al arrancar una ISO limpia, el instalador se detiene en un menú de arranque interactivo (GRUB o ISOLINUX) esperando a que un humano pulse teclas para elegir el idioma o pasarle parámetros.
Para solucionar esto, los lenguajes de los hipervisores incluyen funciones para inyectar pulsaciones de teclado de forma virtual (Scancodes). Las herramientas de IaC aprovechan esto levantando un servidor web temporal donde guardan el archivo preseed.cfg, y luego "teclean" en la máquina virtual la dirección de red de ese archivo.