Los playbooks de Ansible son archivos YAML que describen la configuración deseada de la infraestructura de forma declarativa. Mientras que los comandos ad-hoc son útiles para tareas puntuales, los playbooks permiten definir flujos completos de automatización reutilizables, ordenados y mantenibles. En este artículo construiremos nuestro primer playbook para instalar y configurar Nginx desde cero.

Estructura de un playbook YAML

Un playbook se compone de uno o varios plays. Cada play define sobre qué hosts ejecutar, qué tareas realizar y con qué privilegios. El formato YAML es sensible a la indentación, por lo que es fundamental mantener consistencia con espacios (no tabs).

«`
---
- name: Configurar servidor web Nginx
  hosts: webservers
  become: yes
  vars:
    nginx_port: 80
    server_name: "example.com"

  tasks:
    - name: Instalar Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes
      notify: Reiniciar Nginx

    - name: Crear directorio del sitio
      file:
        path: /var/www/{{ server_name }}
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

    - name: Copiar configuración del sitio
      copy:
        src: files/nginx.conf
        dest: /etc/nginx/sites-available/{{ server_name }}
      notify: Recargar Nginx

    - name: Habilitar el sitio
      file:
        src: /etc/nginx/sites-available/{{ server_name }}
        dest: /etc/nginx/sites-enabled/{{ server_name }}
        state: link
      notify: Recargar Nginx

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

    - name: Recargar Nginx
      service:
        name: nginx
        state: reloaded```


Variables: vars, vars_files y group_vars

Las variables son esenciales para hacer los playbooks reutilizables. Se pueden definir de múltiples formas, desde declaraciones inline hasta archivos independientes por grupo de hosts o por host específico.

```
# variables inline en el playbook
vars:
  nginx_port: 80
  server_name: "example.com"
  php_version: "8.4"

# vars_files — archivo externo de variables
vars_files:
  - vars/main.yml

# group_vars — variables para todo un grupo de hosts
# group_vars/all.yml → aplica a todos los hosts
# group_vars/webservers.yml → solo para webservers

# Ejemplo group_vars/webservers.yml
---
nginx_port: 8080
server_name: "app.example.com"
enable_ssl: true```


Handlers: ejecución condicional en cambios

Los handlers son tareas especiales que solo se ejecutan cuando son notificadas por otra tarea mediante la directiva notify. Esto evita reinicios innecesarios de servicios. Solo se ejecutan una vez al final del play, incluso si múltiples tareas notifican al mismo handler. Son ideales para reiniciar servicios después de cambios en archivos de configuración.

```
tasks:
  - name: Actualizar configuración de Nginx
    template:
      src: templates/nginx.conf.j2
      dest: /etc/nginx/nginx.conf
    notify: Recargar Nginx

  - name: Actualizar sitio virtual
    template:
      src: templates/site.conf.j2
      dest: /etc/nginx/sites-available/default
    notify: Recargar Nginx

handlers:
  - name: Recargar Nginx
    service:
      name: nginx
      state: reloaded```


Con playbooks, variables y handlers ya puedes construir automatizaciones sólidas y reutilizables. En el próximo artículo profundizaremos en roles, templates Jinja2 y la organización de proyectos complejos.

Infografía Ansible: Playbooks, tasks, handlers y variables — tu primera automatización
Infografía: Ansible: Playbooks, tasks, handlers y variables — tu primera automatización