En Ansible, los roles son una forma de organizar y reutilizar el código de manera eficiente. La estructura del directorio de roles es fundamental para mantener el código limpio, modular y fácil de mantener. En esta sección, aprenderás cómo estructurar un directorio de roles en Ansible.

¿Qué es un Rol en Ansible?

Un rol en Ansible es una colección de tareas, archivos, plantillas y variables que se pueden reutilizar en múltiples playbooks. Los roles permiten dividir el código en componentes más pequeños y manejables, facilitando la colaboración y el mantenimiento.

Estructura Básica del Directorio de Roles

La estructura del directorio de roles sigue una convención específica que Ansible reconoce automáticamente. A continuación, se muestra la estructura básica de un directorio de roles:

roles/
└── nombre_del_rol/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    ├── files/
    ├── vars/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml
    ├── meta/
    │   └── main.yml
    └── README.md

Descripción de los Directorios y Archivos

  1. tasks/: Contiene los archivos YAML que definen las tareas que el rol ejecutará. El archivo main.yml es el punto de entrada principal para las tareas del rol.

    # roles/nombre_del_rol/tasks/main.yml
    - name: Instalar Apache
      apt:
        name: apache2
        state: present
    
  2. handlers/: Contiene los archivos YAML que definen los manejadores. Los manejadores son tareas que se ejecutan en respuesta a notificaciones de otras tareas.

    # roles/nombre_del_rol/handlers/main.yml
    - name: Reiniciar Apache
      service:
        name: apache2
        state: restarted
    
  3. templates/: Contiene archivos de plantillas que pueden ser utilizados por las tareas del rol. Las plantillas suelen estar en formato Jinja2.

    # roles/nombre_del_rol/templates/apache2.conf.j2
    ServerName {{ ansible_hostname }}
    
  4. files/: Contiene archivos que pueden ser copiados directamente a los nodos gestionados.

    # roles/nombre_del_rol/files/index.html
    <html>
    <body>
    <h1>¡Hola, Mundo!</h1>
    </body>
    </html>
    
  5. vars/: Contiene archivos YAML que definen variables específicas del rol. Estas variables tienen una prioridad más alta que las variables en defaults/.

    # roles/nombre_del_rol/vars/main.yml
    apache_port: 8080
    
  6. defaults/: Contiene archivos YAML que definen las variables por defecto del rol. Estas variables tienen la prioridad más baja.

    # roles/nombre_del_rol/defaults/main.yml
    apache_port: 80
    
  7. meta/: Contiene metadatos sobre el rol, como dependencias de otros roles.

    # roles/nombre_del_rol/meta/main.yml
    dependencies:
      - { role: common, some_var: 42 }
    
  8. README.md: Archivo opcional que proporciona documentación sobre el rol, cómo usarlo y cualquier otra información relevante.

Ejemplo Práctico

Vamos a crear un rol llamado webserver que instala y configura Apache.

Paso 1: Crear la Estructura del Directorio

mkdir -p roles/webserver/{tasks,handlers,templates,files,vars,defaults,meta}
touch roles/webserver/{tasks,handlers,vars,defaults,meta}/main.yml
touch roles/webserver/README.md

Paso 2: Definir las Tareas

# roles/webserver/tasks/main.yml
- name: Instalar Apache
  apt:
    name: apache2
    state: present

- name: Copiar archivo de configuración
  template:
    src: apache2.conf.j2
    dest: /etc/apache2/apache2.conf
  notify: Reiniciar Apache

Paso 3: Definir los Manejadores

# roles/webserver/handlers/main.yml
- name: Reiniciar Apache
  service:
    name: apache2
    state: restarted

Paso 4: Crear una Plantilla

# roles/webserver/templates/apache2.conf.j2
ServerName {{ ansible_hostname }}
Listen {{ apache_port }}

Paso 5: Definir Variables por Defecto

# roles/webserver/defaults/main.yml
apache_port: 80

Paso 6: Documentar el Rol

# roles/webserver/README.md
# Webserver Role

Este rol instala y configura Apache en un servidor.

## Variables

- `apache_port`: El puerto en el que Apache escuchará (por defecto: 80).

Ejercicio Práctico

Ejercicio

  1. Crea un rol llamado database que instala y configura MySQL.
  2. Define las tareas necesarias para instalar MySQL.
  3. Crea un manejador que reinicie el servicio MySQL.
  4. Usa una plantilla para configurar el archivo my.cnf.
  5. Define una variable por defecto para el puerto de MySQL.

Solución

Estructura del Directorio

mkdir -p roles/database/{tasks,handlers,templates,files,vars,defaults,meta}
touch roles/database/{tasks,handlers,vars,defaults,meta}/main.yml
touch roles/database/README.md

Tareas

# roles/database/tasks/main.yml
- name: Instalar MySQL
  apt:
    name: mysql-server
    state: present

- name: Copiar archivo de configuración
  template:
    src: my.cnf.j2
    dest: /etc/mysql/my.cnf
  notify: Reiniciar MySQL

Manejadores

# roles/database/handlers/main.yml
- name: Reiniciar MySQL
  service:
    name: mysql
    state: restarted

Plantilla

# roles/database/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}

Variables por Defecto

# roles/database/defaults/main.yml
mysql_port: 3306

Documentación

# roles/database/README.md
# Database Role

Este rol instala y configura MySQL en un servidor.

## Variables

- `mysql_port`: El puerto en el que MySQL escuchará (por defecto: 3306).

Conclusión

En esta sección, hemos aprendido cómo estructurar un directorio de roles en Ansible. La estructura organizada y modular de los roles facilita la reutilización y el mantenimiento del código. Ahora estás listo para crear y gestionar roles de manera eficiente en tus proyectos de Ansible.

© Copyright 2024. Todos los derechos reservados