Ansible
Ansible automatiza la configuración de servidores y servicios con playbooks YAML y módulos idempotentes. Los equipos de Python lo usan para inicializar hosts, desplegar aplicaciones y aplicar endurecimiento básico del SO sin mantener scripts de shell imperativos.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
# playbook.yml
- hosts: web
become: true
tasks:
- name: Ensure app directory exists
ansible.builtin.file:
path: /opt/myapp
state: directory
mode: "0755"
- name: Deploy config
ansible.builtin.template:
src: templates/app.env.j2
dest: /opt/myapp/.env
mode: "0600"ansible-playbook -i inventory.ini playbook.yml --check
ansible-playbook -i inventory.ini playbook.ymlCuándo usar esto:
- Configuración de SO y paquetes en VMs o metal desnudo
- Flujos de trabajo SSH sin agente sin instalar demonios en los destinos
- Convergencia ad-hoc cuando necesites informes de idempotencia
changed=0 - Pegamento entre IaC y aplicaciones - la nube crea instancias, Ansible las configura
- Equipos pequeños que prefieren YAML sobre un programa completo de Pulumi/Terraform
Ejemplo de trabajo
Un proyecto mínimo con inventario, rol y plantilla Jinja2 desplegado a través de ansible-playbook.
# inventory.ini
[web]
web1 ansible_host=127.0.0.1 ansible_connection=local# site.yml
- hosts: web
roles:
- myapp# roles/myapp/tasks/main.yml
- name: Create app user
ansible.builtin.user:
name: myapp
system: true
shell: /usr/sbin/nologin
- name: Install Python venv package (Debian family)
ansible.builtin.apt:
name: python3-venv
state: present
become: true
- name: Deploy environment file
ansible.builtin.template:
src: app.env.j2
dest: /etc/myapp.env
owner: root
group: myapp
mode: "0640"# roles/myapp/templates/app.env.j2
APP_ENV={{ app_env | default('dev') }}
LOG_LEVEL={{ log_level | default('info') }}ansible-playbook -i inventory.ini site.yml -e app_env=prod -e log_level=warningLo que esto demuestra:
- El inventario agrupa hosts;
ansible_connection=localse ejecuta en tu máquina para demostraciones - Los roles agrupan tareas, plantillas y valores predeterminados en unidades reutilizables
ansible.builtin.templaterenderiza Jinja2 con variables de-eo group_vars- Los módulos informan
changedsolo cuando el estado difiere realmente
Inmersión Profunda
Cómo funciona
- Ansible se conecta a través de SSH (o local) y envía módulos de tareas al objetivo
- Cada módulo compara el estado deseado (argumentos YAML) con el estado real y converge
- Los hechos se recopilan una vez por jugada a menos que
gather_facts: false - Los manejadores se ejecutan al final de la jugada, solo si una tarea cambiada los notificó
- Vault cifra secretos en el repositorio; descifra en tiempo de ejecución con
--ask-vault-passo un archivo de clave
Conceptos Clave
| Concepto | Propósito |
|---|---|
| Inventario | Grupos de hosts y variables de conexión |
| Playbook | Jugadas y tareas ordenadas |
| Rol | Paquete reutilizable de tareas/plantillas |
| Módulo | Unidad de trabajo idempotente (apt, file, service) |
| Manejador | Reinicia el servicio solo cuando la configuración cambia |
Notas de Python
# Llama a Ansible desde Python a través de ansible-runner (orquestación opcional)
import ansible_runner
result = ansible_runner.run(
playbook="site.yml",
inventory="inventory.ini",
extravars={"app_env": "staging"},
)
assert result.status == "successful", result.stdout.read()Errores Comunes
- Usar
shellpara todo - pierde idempotencia e informes dechanged. Solución: busca primero el móduloansible.builtin.*correspondiente. - Secretos en group_vars sin cifrar - las credenciales terminan en el historial de git. Solución:
ansible-vault encrypt_stringo plugins de búsqueda de almacenes de secretos externos. - Ejecutar sin
--checkprimero - sorpresas en hosts compartidos. Solución: simulación en CI y requerir aprobación para jugadas de producción. - Colecciones sin fijar -
ansible-galaxy collection installdescarga la última versión y rompe los playbooks. Solución: fija las versiones enrequirements.yml. - Contraseña de
becomeen CI - los prompts interactivos fallan las canalizaciones. Solución: sudo sin contraseña para el usuario de despliegue o usa AWX/Tower con credenciales almacenadas.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Pulumi/Terraform | Ciclo de vida de recursos en la nube | Solo necesitas configuración de paquetes de SO en VMs existentes |
| Scripts Fabric/paramiko | Comandos remotos únicos | Necesitas informes de convergencia idempotentes |
| cloud-init | Solo primer arranque en instancias nuevas | Corrección continua de deriva de configuración |
| Salt/Chef | Flota grande con agentes aceptables | Quieres simplicidad SSH sin agente |
Preguntas Frecuentes
¿Por qué Ansible en lugar de scripts de shell sobre SSH?
Los módulos comparan el estado deseado frente al real e informan recuentos de changed. Los scripts de shell se ejecutan ciegamente y ocultan la deriva.
¿Puedo gestionar recursos de AWS con Ansible?
Sí - usa módulos de la colección amazon.aws (ec2_instance, s3_bucket). Para topologías de VPC complejas, combina Terraform/Pulumi para la nube y Ansible para la configuración del host.
¿Cuál es la diferencia entre una jugada y un rol?
Una jugada apunta a grupos de hosts y lista tareas o roles. Un rol es una carpeta reutilizable de tareas, manejadores, plantillas y valores predeterminados incluidos por las jugadas.
¿Cómo pruebo playbooks localmente?
Usa ansible_connection=local en el inventario o Molecule con drivers Docker/Podman para converger instancias de prueba efímeras.
¿Cuándo deben ejecutarse los manejadores?
Los manejadores se ejecutan una vez al final de la jugada, solo si una tarea los notificó e informó changed. Úsalos para reiniciar servicios después de actualizar la configuración.
¿Cómo paso valores específicos del entorno?
Usa group_vars/<grupo>.yml, host_vars/, o -e clave=valor en tiempo de ejecución. Mantén la estructura idéntica en todos los entornos, solo cambia los valores.
¿Ansible requiere Python en el objetivo?
La mayoría de los módulos necesitan Python en el host remoto (preinstalado en Linux principal). Los módulos command/shell sin procesar funcionan sin él pero pierden idempotencia.
¿Cómo acelero inventarios grandes?
Habilita el pipelining SSH, usa strategy: free para hosts independientes y limita la recopilación de hechos con gather_subset cuando los hechos completos no son necesarios.
¿Puedo ejecutar Ansible desde un venv de Python 3.14?
Sí - instala ansible en el venv de tu proyecto con uv pip install ansible e invoca ansible-playbook desde ese entorno para versiones reproducibles.
¿Qué es el modo de verificación?
--check simula cambios sin aplicarlos. Combínalo con --diff para previsualizar los cambios de contenido de archivos antes de las ejecuciones de producción.
Relacionado
- Conceptos Básicos de Automatización de Infraestructura - Mentalidad de IaC e idempotencia
- Gestión de Configuración - plantillas y secretos
- Aprovisionamiento de Recursos en la Nube - ciclo de vida de recursos en la nube
- Pruebas de Código de Infraestructura - Molecule y comprobaciones de políticas
- Mejores Prácticas de Automatización de Infraestructura - reglas de automatización auditables
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.