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
-
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
-
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
-
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 }}
-
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>
-
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
-
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
-
meta/: Contiene metadatos sobre el rol, como dependencias de otros roles.
# roles/nombre_del_rol/meta/main.yml dependencies: - { role: common, some_var: 42 }
-
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
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
- Crea un rol llamado
database
que instala y configura MySQL. - Define las tareas necesarias para instalar MySQL.
- Crea un manejador que reinicie el servicio MySQL.
- Usa una plantilla para configurar el archivo
my.cnf
. - 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
Plantilla
Variables por Defecto
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.
Ansible: De Principiante a Avanzado
Módulo 1: Introducción a Ansible
Módulo 2: Conceptos Básicos de Ansible
Módulo 3: Playbooks
- Introducción a los Playbooks
- Escribiendo tu Primer Playbook
- Estructura del Playbook
- Variables y Hechos
- Condicionales y Bucles
Módulo 4: Roles
Módulo 5: Técnicas Avanzadas de Playbook
Módulo 6: Ansible Galaxy
Módulo 7: Ansible Tower
- Introducción a Ansible Tower
- Instalando Ansible Tower
- Usando Ansible Tower
- Gestionando Proyectos e Inventarios
Módulo 8: Ansible para DevOps
Módulo 9: Mejores Prácticas de Ansible
- Organización del Código
- Mejores Prácticas de Seguridad
- Ajuste de Rendimiento
- Pruebas de Código Ansible