Ansible¶
5. Escribir y ejecutar playbooks¶
5.1 Estructura de un playbook¶
Un playbook es un archivo YAML que contiene uno o varios plays. Cada play tiene al menos tres elementos obligatorios: sobre qué hosts actuar, con qué permisos, y qué tareas ejecutar.
Todo playbook es, en esencia, un archivo YAML. Lo que convierte un archivo YAML en un playbook es el uso de las palabras clave propias de Ansible (hosts, tasks, become, vars, etc.) y de los módulos que ejecutarán las tareas.
El esquema general es el siguiente:
-),
indicando el primer elemento de esa lista.
Las palabras clave principales de un play son:
| Palabra clave | Descripción |
|---|---|
name |
Descripción del play o la tarea. Aparece en la salida al ejecutar el playbook. |
hosts |
A qué hosts o grupos del inventario se aplica este play. |
become |
Si es true, Ansible ejecutará las tareas con privilegios elevados. |
tasks |
Lista de tareas que se ejecutarán en orden sobre los hosts indicados. |
Cada tarea tiene también su propio name, que ayuda a entender qué está haciendo Ansible en cada momento
durante la ejecución, y a localizar errores cuando algo falla.
El orden importa
Las tareas de un play se ejecutan en el orden en que están escritas, una tras otra, y sobre todos los hosts del play antes de pasar a la siguiente. Si una tarea falla en un host, Ansible detiene la ejecución en ese host pero continúa con los demás.
5.2 Un primer playbook¶
El siguiente playbook realiza la actualización del sistema en todos los hosts del inventario, algo que ya vimos con un comando ad-hoc en la sección anterior. Comparando ambas formas se aprecia bien la diferencia de estructura:
| Ad-hoc equivalente | |
|---|---|
| actualizar_sistema.yml | |
|---|---|
Los argumentos del módulo apt son exactamente los mismos en ambos casos; la diferencia es que en el
playbook cada argumento ocupa su propia línea como clave-valor YAML, lo que resulta mucho más legible
cuando el número de argumentos crece.
El argumento cache_valid_time merece una explicación: indica a Ansible que solo actualice la caché de
apt si han pasado más de 600 segundos (10 minutos) desde la última actualización. Si la caché es
suficientemente reciente, no se vuelve a descargar.
Un segundo ejemplo, también relacionado con los ad-hoc vistos antes, que instala un paquete y asegura que su servicio está arrancado y habilitado en el arranque:
| instalar_apache2.yml | |
|---|---|
Este playbook ilustra bien cómo varias tareas de un mismo play se encadenan de forma natural y legible.
Nótese que está dirigido solo al grupo servidores_web, no a all.
Puede comprobarse la sintaxis del playbook con:
Nombres descriptivos
Vale la pena dedicar un momento a escribir buenos name en plays y tareas. Durante la ejecución,
Ansible los muestra en tiempo real; unos nombres claros permiten saber de un vistazo qué está
ocurriendo y localizar rápidamente cualquier error.
5.3 Ejecutar un playbook¶
Los playbooks se ejecutan con el comando ansible-playbook:
Por ejemplo:
| Ejemplo | |
|---|---|
Niveles de detalle: -v¶
Por defecto, Ansible muestra un resumen de qué ha cambiado y qué no en cada host. Con la opción -v se
puede aumentar el nivel de detalle de la salida:
| Opción | Nivel de detalle |
|---|---|
-v |
Muestra el resultado de cada tarea |
-vv |
Añade información sobre los archivos y conexiones |
-vvv |
Añade detalles de la conexión SSH |
-vvvv |
Nivel máximo, incluye información de bajo nivel para depuración |
En el día a día, -v suele ser suficiente para entender qué ha hecho Ansible. Los niveles más altos son
útiles cuando algo falla y hay que depurar.
Modo de prueba: --check¶
La opción --check ejecuta el playbook en modo simulación: Ansible analiza qué cambios tendría que hacer
pero no los aplica. Es muy útil para revisar el efecto de un playbook antes de ejecutarlo de verdad:
| Ejemplo | |
|---|---|
Limitaciones de --check
No todos los módulos soportan --check de forma completa. Algunos módulos que dependen del resultado
de tareas anteriores pueden producir resultados incorrectos en modo simulación, porque las tareas
previas no se han ejecutado realmente. Úsalo como orientación, no como garantía absoluta.
Listar hosts¶
Si se quiere comprobar sobre qué hosts actuará un playbook antes de ejecutarlo, puede utilizarse:
Limitar hosts: --limit¶
Al igual que con los comandos ad-hoc, --limit restringe la ejecución a un subconjunto de los hosts
que el playbook seleccionaría normalmente:
El filtro admite varias formas:
| Filtro | Efecto |
|---|---|
192.168.12.11 |
Solo ese host |
servidores_web |
Solo ese grupo |
192.168.12.* |
Todos los hosts que coincidan con el patrón |
servidores_web:bases_de_datos |
Ambos grupos |
!192.168.12.11 |
Todos los hosts del play excepto ese |
servidores_web:!192.168.12.11 |
El grupo entero excepto ese host |
El operador ! es especialmente útil cuando se quiere excluir un host concreto de una ejecución, por
ejemplo porque está en mantenimiento o porque se quiere aplicar un cambio de forma progresiva:
| Ejemplos | |
|---|---|
Comillas con ! en bash
El carácter ! tiene un significado especial en bash (historial de comandos). Al usarlo en --limit
conviene entrecomillar el argumento con comillas simples para evitar comportamientos inesperados.
El resumen final¶
Al terminar la ejecución, Ansible muestra siempre un resumen por host con el resultado de las tareas:
| Campo | Significado |
|---|---|
ok |
Tareas ejecutadas correctamente (incluye las que no cambiaron nada) |
changed |
Tareas que sí realizaron algún cambio en el sistema |
unreachable |
Hosts a los que Ansible no pudo conectarse |
failed |
Tareas que terminaron con error |
skipped |
Tareas que se saltaron por alguna condición |
Un changed=0 en todos los hosts significa que el sistema ya estaba exactamente en el estado deseado:
la idempotencia en acción.
Si un host aparece como failed o unreachable, el resto de hosts continúan ejecutando el playbook
de forma independiente.
📅 Documento escrito el 01/06/2026 · Última revisión: 02/07/2026 · Versión: v1.0