El Problema del "Huevo y la Gallina" en el Aprovisionamiento

Para que cualquier herramienta de Infraestructura como Código (IaC) o de gestión de configuraciones (Ansible, Puppet, Vagrant, etc.) pueda tomar el control de un sistema operativo recién instalado, se requiere un canal de comunicación remoto y un nivel de privilegios elevado.

El problema radica en que, por defecto, un sistema operativo recién instalado es un entorno cerrado, seguro y aislado. Si analizamos una instalación estándar y manual (como la de un Debian Server), el asistente solo nos guía para configurar los parámetros esenciales de supervivencia de la máquina:

Fuera de eso, el sistema no expone servicios automatizados ni permite accesos externos. Las herramientas de automatización no pueden "adivinar" cómo entrar ni tienen permisos para realizar cambios estructurales (como instalar paquetes o modificar servicios) a menos que preparemos un entorno mínimo de bootstrap (arranque inicial).

Para resolver esto, el instalador del sistema (mediante preseed, autoinstall o imágenes base modificadas) debe preconfigurar de forma obligatoria dos pilares fundamentales:

  1. Un mecanismo de autenticación sin intervención humana (llaves SSH o certificados HTTPS).
  2. Elevación de privilegios no interactiva (ejecución de comandos como administrador sin que el sistema pida una contraseña en mitad del script).

Requerimientos Mínimos de Configuración (Snippets de Referencia)

Si tuviéramos que preparar este punto de entrada de forma manual (que es exactamente lo que automatizamos luego en el preseed o en la ISO), estos son los comandos y configuraciones esenciales que se deben aplicar en la máquina destino:

1. Gestión de Usuarios y Elevación de Privilegios (Sudo)

El usuario utilizado por la herramienta de IaC necesita ejecutar comandos como root. Dado que no hay un humano detrás de la pantalla para escribir la contraseña cada vez que se ejecuta sudo, se debe configurar una regla NOPASSWD.

# 1. Crear el usuario dedicado al aprovisionamiento
useradd -m -s /bin/bash provision

# 2. Asegurar que sudo está instalado (esencial en Debian base)
apt-get update && apt-get install -y sudo

# 3. Permitir al usuario ejecutar sudo sin contraseña
# Se recomienda crear un archivo propio en sudoers.d en lugar de modificar /etc/sudoers directamente
echo "provision ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/provision

# 4. Asignar los permisos correctos al archivo de configuración
chmod 440 /etc/sudoers.d/provision

2. Configuración del Acceso Remoto Seguro (Mecanismo SSH)

Para evitar el uso de contraseñas de texto plano en los scripts, se fuerza el uso de autenticación por llave pública.

En la máquina cliente (tu equipo o el servidor de CI/CD):

Se genera un par de claves temporal o específico para esta infraestructura: