En este tema, aprenderás cómo crear roles en Ansible. Los roles son una forma de organizar y reutilizar el código de Ansible, lo que facilita la gestión y el mantenimiento de configuraciones complejas. Vamos a desglosar el proceso de creación de roles en pasos claros y concisos.
¿Qué es un Rol en Ansible?
Un rol en Ansible es una colección de tareas, archivos, plantillas, variables y manejadores que se pueden reutilizar en múltiples playbooks. Los roles permiten estructurar el código de manera modular y organizada.
Estructura de un Rol
La estructura de un rol en Ansible sigue un formato específico. Aquí tienes un ejemplo de la estructura de directorios de un rol típico:
my_role/
├── defaults/
│ └── main.yml
├── files/
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
├── tests/
│ ├── inventory
│ └── test.yml
└── vars/
└── main.ymlDescripción de los Directorios
- defaults/: Contiene las variables por defecto del rol.
- files/: Contiene archivos que se pueden copiar a los hosts gestionados.
- handlers/: Contiene manejadores que se pueden notificar desde las tareas.
- meta/: Contiene metadatos sobre el rol, como dependencias.
- tasks/: Contiene las tareas que se ejecutarán en los hosts gestionados.
- templates/: Contiene plantillas que se pueden renderizar y copiar a los hosts gestionados.
- tests/: Contiene archivos para probar el rol.
- vars/: Contiene variables que se pueden utilizar en el rol.
Creando un Rol Paso a Paso
Paso 1: Crear la Estructura del Rol
Puedes crear la estructura del rol manualmente o utilizando el comando ansible-galaxy init. Aquí utilizaremos el comando para simplificar el proceso:
Este comando creará la estructura de directorios y archivos necesarios para el rol my_role.
Paso 2: Definir Tareas en tasks/main.yml
El archivo tasks/main.yml es donde definirás las tareas que el rol ejecutará. Aquí tienes un ejemplo simple de un archivo tasks/main.yml que instala un paquete:
---
# tasks file for my_role
- name: Instalar el paquete nginx
apt:
name: nginx
state: present
become: truePaso 3: Definir Variables en defaults/main.yml
El archivo defaults/main.yml es donde puedes definir las variables por defecto para el rol. Aquí tienes un ejemplo:
Paso 4: Definir Manejadores en handlers/main.yml
El archivo handlers/main.yml es donde puedes definir los manejadores que se ejecutarán cuando sean notificados por las tareas. Aquí tienes un ejemplo:
Paso 5: Utilizar Archivos y Plantillas
Si necesitas copiar archivos o plantillas a los hosts gestionados, puedes colocarlos en los directorios files/ y templates/ respectivamente. Aquí tienes un ejemplo de cómo usar una plantilla en una tarea:
---
# tasks file for my_role
- name: Copiar la plantilla de configuración de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reiniciar nginxPaso 6: Definir Metadatos en meta/main.yml
El archivo meta/main.yml es donde puedes definir metadatos sobre el rol, como dependencias. Aquí tienes un ejemplo:
Ejemplo Completo
Aquí tienes un ejemplo completo de un rol que instala y configura nginx:
Estructura del Rol
my_role/
├── defaults/
│ └── main.yml
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
│ └── nginx.conf.j2
└── vars/
└── main.ymlContenido de los Archivos
defaults/main.yml
handlers/main.yml
tasks/main.yml
---
- name: Instalar el paquete nginx
apt:
name: "{{ nginx_package }}"
state: present
become: true
- name: Copiar la plantilla de configuración de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reiniciar nginxtemplates/nginx.conf.j2
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}meta/main.yml
Ejercicio Práctico
Ejercicio
Crea un rol llamado apache_role que haga lo siguiente:
- Instale el paquete
apache2. - Copie una plantilla de configuración de Apache desde
templates/apache2.conf.j2a/etc/apache2/apache2.conf. - Defina un manejador que reinicie el servicio
apache2cuando la configuración cambie.
Solución
Estructura del Rol
apache_role/
├── defaults/
│ └── main.yml
├── handlers/
│ └── main.yml
├── meta/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
│ └── apache2.conf.j2
└── vars/
└── main.ymldefaults/main.yml
handlers/main.yml
tasks/main.yml
---
- name: Instalar el paquete apache2
apt:
name: "{{ apache_package }}"
state: present
become: true
- name: Copiar la plantilla de configuración de apache2
template:
src: apache2.conf.j2
dest: /etc/apache2/apache2.conf
notify: Reiniciar apachetemplates/apache2.conf.j2
# This is a basic configuration file for Apache2
ServerName localhost
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combinedmeta/main.yml
Conclusión
En esta sección, has aprendido cómo crear roles en Ansible, desde la estructura básica hasta la implementación de tareas, manejadores y plantillas. Los roles son una herramienta poderosa para organizar y reutilizar el código de Ansible, lo que facilita la gestión de configuraciones complejas. En el próximo tema, aprenderás cómo usar roles en playbooks para aprovechar al máximo su modularidad y reutilización.
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
