Introducción a los Playbooks de Ansible

Sintaxis y estructura básica de un playbook

Los playbooks de Ansible son archivos escritos en formato YAML que permiten automatizar tareas complejas mediante una serie de instrucciones organizadas lógicamente. A diferencia del modo ad-hoc, que ejecuta comandos individuales, los playbooks permiten definir múltiples tareas secuenciales aplicables a uno o más hosts gestionados.

---
- name: Instalación y configuración del servidor web
  hosts: webservers
  tasks:
    - name: Asegurar que Apache esté instalado
      yum:
        name: httpd
        state: latest
    - name: Asegurar que el servicio esté activo
      service:
        name: httpd
        enabled: true
        state: started

Ejecución de playbooks

Para ejecutar un playbook, se utiliza el comando ansible-playbook seguido del nombre del archivo:

ansible-playbook sitio.yml

La salida muestra cada tarea ejecutada, su estado y un resumen final por host. Es recomendable usar la opción -v (o -vvv) para obtener información detallada sobre la conexión y la ejecución de tareas.

Verificación de sintaxis y simulaciones

Antes de aplicar cambios reales, es posible verificar la sintaxis sin ejecutar el playbook:

ansible-playbook --syntax-check sitio.yml

Además, se puede realizar una ejecución simulada con la opción -C, que muestra qué cambios se realizarían sin aplicarlos realmente:

ansible-playbook -C sitio.yml

Elementos clave de un playbook

  • hosts: Define los hosts o grupos sobre los cuales se aplicará el bloque de tareas.
  • tasks: Lista ordenada de acciones a ejecutar en los hosts especificados.
  • vars: Variables locales al playbook, útiles para personalizar comportamientos.
  • handlers: Tareas especiales que solo se ejecutan cuando son notificadas por otras tareas.
  • tags: Etiquetas que permiten ejecutar selectivamente partes del playbook.

Gestión de tareas y recolección de datos

Por defecto, Ansible recopila información del sistema remoto usando el módulo setup. Este proceso, conocido como fact gathering, puede desactivarse si no se requiere:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Copiar archivo de configuración
      copy:
        src: /ruta/local/config.conf
        dest: /etc/app/config.conf

Manejadores y notificaciones

Los manejadores permiten reaccionar a cambios realizados por tareas. Por ejemplo, reiniciar un servicio tras modificar su configuración:

---
- hosts: app-servers
  tasks:
    - name: Actualizar configuración de Nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Reiniciar Nginx

  handlers:
    - name: Reiniciar Nginx
      service:
        name: nginx
        state: restarted

La notificación solo dispara el handler si la tarea anterior reporta un cambio (changed).

Uso de variables

Ansible soporta múltiples niveles de definición de variables. La prioridad sigue este orden (de menor a mayor):

  1. Variables del inventario (grupo o host)
  2. Variables definidas en el playbook
  3. Variables pasadas desde línea de comandos

Definición dentro del playbook:

---
- hosts: all
  vars:
    directorio_app: /opt/myapp
    puerto_servicio: 8080
  tasks:
    - name: Crear directorio de aplicación
      file:
        path: "{{ directorio_app }}"
        state: directory

Pasando variables desde consola:

ansible-playbook deploy.yml -e "directorio_app=/var/www/html"

También se pueden cargar variables desde archivos externos:

---
- hosts: all
  vars_files:
    - ./vars/config.yml
  tasks:
    - name: Mostrar puerto
      debug:
        msg: "Puerto configurado: {{ puerto_servicio }}"

Organización con múltiples plays

Un mismo archivo puede contener varios plays, cada uno dirigido a diferentes conjuntos de hosts:

---
- name: Configurar servidores web
  hosts: webservers
  tasks:
    - name: Instalar Apache
      yum:
        name: httpd
        state: present

- name: Configurar base de datos
  hosts: dbservers
  tasks:
    - name: Instalar MariaDB
      yum:
        name: mariadb-server
        state: present

Etiquetado de tareas

Las etiquetas permiten ejecutar subconjuntos específicos de tareas:

---
- hosts: all
  tasks:
    - name: Instalar paquetes básicos
      yum:
        name: vim
        state: present
      tags: utilidades

    - name: Desplegar aplicación
      copy:
        src: app.jar
        dest: /opt/app/
      tags: deploy

Ejecutar solo tareas con cierta etiqueta:

ansible-playbook sitio.yml -t deploy

Omitir ceirtas etiquetas:

ansible-playbook sitio.yml --skip-tags utilidades

Estrategias de ejecución

El número de conexiones simultáneas se controla con la opción -f:

ansible-playbook sitio.yml -f 10

Este valor también puede configurarse en ansible.cfg. Ansible distribuye las tareas entre los hosts disponibles, manteniendo hasta f procesos trabajando en paralelo. Si un host falla, el playbook continúa con los demás, aunque ese host no avance en el play actual.

Convenciones recomendadas

  • Usar siempre name en tareas y plays para claridad en la salida.
  • Evitar el uso innecesario de gather_facts si no se utilizan variables del sistema.
  • Organizar variables complejas en archivos separados bajo group_vars/ o host_vars/.
  • Utilizar plantillas (template) para archivos de configuración dinámicos.

Etiquetas: Ansible Playbook YAML automation configuration-management

Publicado el 8-20 09:01