Cuando tienes un servidor, SSH y un script de Bash funcionan bien. Cuando tienes tres, copiar y pegar comandos todavía es manejable. Cuando llegas a cinco o más, necesitas Ansible.
Yo descubrí Ansible cuando mi homelab pasó de 2 a 8 nodos. Mantener actualizados los sistemas, desplegar configuraciones, instalar paquetes, todo eso manualmente se volvió insostenible. Un día actualicé 7 servidores pero olvidé el octavo. Obvio, ese fue el que falló en producción días después.
Ansible resolvió ese problema. Ahora tengo 14 máquinas (entre Raspberry Pis, VMs en Proxmox, containers LXC, nodos de Kubernetes) y las gestiono todas desde mi portátil con comandos que tardan segundos en ejecutarse. Esto es lo que aprendí.
Qué es Ansible y por qué no es como Chef o Puppet#
Ansible es una herramienta de automatización que te permite definir el estado deseado de tus servidores en archivos de texto (YAML) y aplicar esos cambios remotamente. No necesitas instalar agentes en los servidores (como requieren Chef o Puppet). Todo funciona sobre SSH.
Imagina que quieres instalar Docker en 10 servidores. Sin Ansible:
| |
Con Ansible:
| |
Un comando. Todos los servidores. Y si alguno ya tiene Docker instalado, Ansible detecta que no hay cambios necesarios y lo salta (idempotencia).
Ventajas sobre otros sistemas de gestión:
Agentless: no instalas nada en los servidores. Solo necesitan Python (que casi todos los Linux traen) y acceso SSH.
Sintaxis simple: YAML legible, sin DSL complejo como Chef. Si sabes leer indentación, sabes leer Ansible.
Modo push: tú ejecutas Ansible desde tu máquina. Los servidores no “piden” configuración (como en Puppet). Esto es más seguro en homelabs sin IPs públicas.
Comunidad enorme: hay miles de roles y módulos preconstruidos. Necesitas configurar Nginx, hay un rol. PostgreSQL, hay otro. No reinventas la rueda.
Casos de uso reales en mi homelab#
Antes de explicar cómo instalarlo, te cuento para qué lo uso. Así ves si te sirve:
1. Actualizaciones masivas#
Cada domingo ejecuto un playbook que actualiza todos los servidores:
| |
El playbook hace apt update, apt upgrade, reinicia servicios si hace falta, y me manda un resumen por Telegram. Sin tocar cada máquina.
2. Despliegue de configuraciones#
Tengo un rol de Ansible que despliega mi configuración estándar en cualquier servidor nuevo: usuarios, SSH hardening, fail2ban, herramientas comunes (htop, vim, git), timezone, locale. Provisionar un servidor nuevo lleva 3 minutos en lugar de 30.
3. Backups coordinados#
Cada noche, Ansible ejecuta scripts de backup en varios nodos, comprueba que los backups se crearon correctamente, y sube los archivos a un NAS central. Si algo falla, recibo una alerta.
4. Gestión de certificados SSL#
Tengo un playbook que renueva certificados de Let’s Encrypt en todos los reverse proxies (Nginx, Traefik) y recarga los servicios. Antes lo hacía manualmente y más de una vez un certificado expiró porque olvidé un servidor.
5. Despliegue de aplicaciones#
Cuando quiero probar una app nueva (por ejemplo, Uptime Kuma), escribo un playbook que la despliega en un nodo de pruebas, configura el reverse proxy, y si todo va bien, lo ejecuto en producción. Reproducible y versionado en Git.
Instalación de Ansible#
Ansible se instala en TU máquina (tu portátil, tu estación de trabajo). Los servidores remotos no necesitan nada especial.
En Ubuntu/Debian#
| |
Verifica la instalación:
| |
Deberías ver algo como ansible [core 2.16.3] o superior.
En macOS#
| |
En Arch Linux#
| |
Via pip (cualquier OS con Python)#
Si quieres la última versión:
| |
Añade ~/.local/bin a tu PATH si no está ya.
Configuración SSH sin contraseñas#
Ansible usa SSH para conectarse a los servidores. Necesitas autenticación por clave pública (sin contraseñas interactivas).
Genera una clave SSH si no tienes:
| |
Copia la clave pública a cada servidor:
| |
Prueba la conexión:
| |
Deberías entrar sin pedir contraseña. Repite para todos los servidores.
Consejo de seguridad: crea un usuario específico para Ansible (ansible o deploy) con permisos sudo. No uses root directamente.
En cada servidor:
| |
Así Ansible puede ejecutar comandos con sudo sin pedir contraseña.
Inventario: define tus servidores#
El archivo de inventario (inventory.ini o hosts.yml) es donde listas tus servidores. Es el mapa de tu infraestructura.
Crea un archivo ~/ansible/inventory.ini:
| |
Explicación:
[proxmox],[k8s_masters], etc. son grupos. Puedes ejecutar comandos en grupos enteros.ansible_hostes la IP o hostname del servidor.ansible_useres el usuario SSH.[all:vars]define variables para todos los hosts (por ejemplo, qué Python usar).
Prueba que Ansible puede conectarse:
| |
Deberías ver SUCCESS para cada servidor. Si no, revisa SSH.
Tu primer comando ad-hoc#
Los comandos ad-hoc son útiles para tareas rápidas. Sintaxis:
| |
Ejemplos:
Comprobar el uptime de todos los servidores#
| |
Reiniciar todos los servidores del grupo Proxmox#
| |
(--become ejecuta el comando con sudo)
Instalar htop en todos los servidores#
| |
Copiar un archivo a todos los nodos#
| |
Verificar el espacio en disco#
| |
Estos comandos son geniales para emergencias o comprobaciones rápidas. Pero para tareas repetibles, usas playbooks.
Tu primer playbook: actualizar todos los servidores#
Un playbook es un archivo YAML que define una serie de tareas. Crea ~/ansible/playbooks/update-all.yml:
| |
Ejecútalo:
| |
Ansible conecta a todos los servidores, ejecuta las tareas en orden, y te muestra un resumen:
| |
Breakdown del playbook:
hosts: all- ejecutar en todos los servidores del inventario.become: yes- usar sudo para todas las tareas.tasks- lista de acciones a ejecutar.apt- módulo para gestionar paquetes en Debian/Ubuntu.stat- módulo para comprobar si un archivo existe.register- guardar el resultado de una tarea en una variable.when- ejecutar una tarea solo si se cumple una condición.
Playbook más complejo: provisionar un servidor nuevo#
Este playbook configura un servidor desde cero con mi setup estándar. playbooks/provision-server.yml:
| |
Nuevos conceptos aquí:
vars- variables que puedes reutilizar en el playbook.with_items- bucle para ejecutar una tarea múltiples veces con diferentes valores.handlers- tareas que solo se ejecutan si otra tarea hace cambios (por ejemplo, reiniciar SSH solo si modificaste su configuración).notify- llama a un handler.
Ejecuta este playbook en un servidor nuevo:
| |
(--limit restringe la ejecución a un solo host)
Roles: organiza tus playbooks#
Cuando los playbooks crecen, se vuelven difíciles de mantener. Los roles son la forma de modularizar. Un rol es un paquete reutilizable de tareas, plantillas, archivos, y variables.
Estructura típica de un rol:
| |
Ejemplo: rol para instalar y configurar Docker.
Crea la estructura:
| |
roles/docker/tasks/main.yml:
| |
Ahora puedes usar este rol en cualquier playbook:
| |
Ejecuta:
| |
Ventaja de roles: puedes compartirlos entre playbooks o descargar roles de Ansible Galaxy (repositorio público de roles).
Por ejemplo, instalar el rol geerlingguy.docker:
| |
Y usarlo:
| |
Variables y plantillas (Jinja2)#
Ansible usa Jinja2 para generar archivos de configuración dinámicos.
Supón que quieres desplegar una configuración de Nginx con el nombre del servidor y la IP. Crea una plantilla templates/nginx.conf.j2:
| |
En tu playbook:
| |
Ansible reemplaza {{ inventory_hostname }} y {{ ansible_default_ipv4.address }} con los valores reales de cada servidor. Si ejecutas el playbook en 5 servidores, cada uno recibe una configuración adaptada a su contexto.
Ansible Vault: gestiona secretos#
Nunca metas contraseñas o tokens en plain text en tus playbooks. Usa Ansible Vault para encriptar archivos.
Crea un archivo de secretos:
| |
Te pedirá una contraseña. Dentro, escribe:
| |
Guarda y sal. El archivo está encriptado.
Para usarlo en un playbook:
| |
Ejecuta el playbook:
| |
Ansible te pide la contraseña del vault, desencripta secrets.yml, y usa las variables.
Consejo: guarda la contraseña del vault en un archivo y pásala con --vault-password-file:
| |
Tags: ejecuta solo parte de un playbook#
Si tienes un playbook largo y solo quieres ejecutar ciertas tareas, usa tags.
| |
Ejecuta solo las tareas con tag docker:
| |
O excluye tareas con cierto tag:
| |
Esto es útil cuando estás depurando o cuando solo necesitas aplicar cambios específicos.
Integración con Git#
Tus playbooks, roles, inventarios, todo debería estar en Git. Así tienes historial de cambios, puedes revertir si algo rompe, y otros pueden colaborar.
Estructura recomendada de tu repo:
| |
ansible.cfg define configuración global:
| |
Haz commit de todo (excepto .vault_pass y cualquier secreto no encriptado):
| |
Ahora puedes clonar el repo en cualquier máquina y ejecutar playbooks. Reproducibilidad total.
Estrategias de despliegue#
Cuando ejecutas un playbook en múltiples servidores, Ansible por defecto los procesa en paralelo (hasta forks servidores a la vez, por defecto 5). Esto es rápido pero si algo rompe, rompes 5 servidores a la vez.
Para despliegues más seguros, usa serial:
| |
serial: 1 procesa un servidor a la vez. Si falla en el primero, Ansible se detiene antes de tocar el resto. Para clusters grandes, puedes hacer serial: "25%" (procesa 25% de los hosts a la vez).
También existe max_fail_percentage:
| |
Si más del 10% de los hosts fallan, Ansible aborta.
Troubleshooting común#
Ansible no encuentra Python#
Error: /usr/bin/python: not found
Solución: en inventario, añade:
| |
Permisos denegados en sudo#
Error: FAILED! => {"msg": "Missing sudo password"}
Solución: ejecuta con -K (pide contraseña de sudo):
| |
O configura NOPASSWD en /etc/sudoers como expliqué antes.
Fallos intermitentes por SSH#
Si tienes muchos hosts, SSH puede timeoutear. Aumenta el timeout en ansible.cfg:
| |
Playbook muy lento#
Ansible por defecto recoge información de cada host al inicio (facts gathering). Si no necesitas esos datos, deshabilítalo:
| |
Pasa de 10 segundos a 2 segundos en playbooks simples.
Casos de uso avanzados#
CI/CD con Ansible#
Puedes integrar Ansible en pipelines de GitLab CI o GitHub Actions. Cada vez que haces push a main, el pipeline ejecuta playbooks automáticamente.
Ejemplo de .gitlab-ci.yml:
| |
Dynamic inventory con scripts#
Si tus servidores cambian frecuentemente (por ejemplo, VMs en la nube), puedes usar inventarios dinámicos. Ansible ejecuta un script que genera el inventario en JSON.
Ejemplo: script que consulta la API de Proxmox y lista todas las VMs.
| |
Guárdalo como dynamic_inventory.py, hazlo ejecutable, y úsalo:
| |
Integración con AWX/Ansible Tower#
Si tu homelab crece mucho, considera instalar AWX (la versión open source de Ansible Tower). Es una UI web que:
- Ejecuta playbooks desde el navegador.
- Programa ejecuciones periódicas (cron jobs visuales).
- Gestiona inventarios dinámicos.
- Logs y auditoría de todos los despliegues.
Yo no lo uso porque mi homelab es pequeño, pero si gestiono más de 20 servidores lo montaría.
Comparación con otras herramientas#
Terraform vs Ansible: Terraform es para provisionar infraestructura (crear VMs, redes, DNS). Ansible es para configurar lo que ya existe. Úsalos juntos: Terraform crea la VM, Ansible la configura.
Docker/Kubernetes vs Ansible: containers son para aplicaciones, Ansible es para configurar el sistema base. En mi caso, Ansible prepara los nodos (instala Docker, configura red, usuarios) y luego despliego containers encima.
Bash scripts vs Ansible: Bash es más rápido de escribir para cosas simples. Ansible escala mejor, es más legible, y tiene idempotencia incorporada. Usa Bash para scripts de una sola máquina, Ansible para fleets.
Conclusión: escala tu homelab sin perder la cordura#
Ansible es de esas herramientas que al principio piensas “esto es overkill para mi homelab”. Y luego, cuando tu homelab crece, te preguntas cómo sobrevivías sin ella.
La curva de aprendizaje es suave. Empiezas con comandos ad-hoc, luego playbooks simples, luego roles, y de repente estás orquestando despliegues multi-servidor con un solo comando.
En mi caso, Ansible me devolvió horas cada semana. Las actualizaciones de seguridad que antes llevaban una tarde ahora son 5 minutos. Provisionar un servidor nuevo que llevaba una hora ahora es automático. Y lo mejor: todo está documentado en código, versionado en Git, reproducible.
Si tienes más de 3 servidores en tu homelab, monta Ansible este fin de semana. Si tienes menos de 3, móntalo de todas formas. Cuando llegues a 5, estarás agradecido.
Recursos para profundizar:
- Documentación oficial de Ansible
- Ansible Galaxy (roles comunitarios)
- Ansible for DevOps (libro recomendado)
- r/ansible en Reddit
- Jeff Geerling en YouTube (el gurú de Ansible para homelabs)