Los *Roles* en Ansible permiten organizar y reutilizar el código de forma estructurada y modular. Un rol agrupa tareas, variables, archivos y plantillas necesarios para automatizar una funcionalidad específica. Al usar roles, se mejora la legibilidad de los *playbooks* y se facilita la gestión de configuraciones complejas.
Un rol es un conjunto predefinido de tareas, variables y archivos de configuración que se organiza en un directorio específico con una estructura estándar. Los roles se utilizan para aplicar configuraciones o despliegues específicos en los servidores. Por ejemplo, un rol podría encargarse de la instalación de Apache, la configuración de un cortafuegos o la implementación de una aplicación web.
La estructura de un rol se organiza en una serie de directorios dentro de un directorio principal con el nombre del rol. A continuación, se presenta la estructura básica de un rol:
mi_rol/
├── defaults/ # Variables por defecto del rol
│ └── main.yml
├── files/ # Archivos que se copiarán al servidor
├── handlers/ # Tareas que se activan mediante "notify"
│ └── main.yml
├── meta/ # Metadatos del rol (dependencias y autor)
│ └── main.yml
├── tasks/ # Tareas principales del rol
│ └── main.yml
├── templates/ # Plantillas Jinja2 para crear archivos de configuración
├── tests/ # Pruebas para verificar el rol
├── vars/ # Variables definidas para el rol
│ └── main.yml
main.yml
dentro de tasks/
contiene la lista de tareas que ejecutará el rol.
defaults/
.
ansible-galaxy init
:
Para generar la estructura de un rol automáticamente, usa el siguiente comando:
ansible-galaxy init nombre_del_rol
Por ejemplo:
ansible-galaxy init apache
Esto creará un directorio apache/
con la estructura estándar de un rol de Ansible.
Edita el archivo tasks/main.yml
del rol para agregar las tareas que debe ejecutar. Por ejemplo:
# apache/tasks/main.yml
- name: Instalar Apache
apt:
name: apache2
state: present
- name: Iniciar y habilitar el servicio de Apache
systemd:
name: apache2
enabled: yes
state: started
Para utilizar un rol en un playbook, usa la directiva roles
. Un ejemplo de un playbook que aplica el rol apache
sería:
# playbook.yml
- hosts: webservers
become: yes
roles:
- apache
Dentro del rol, puedes definir variables en defaults/main.yml
o vars/main.yml
y usarlas en plantillas ubicadas en templates/
. Por ejemplo:
Archivo de variables (vars/main.yml
):
# apache/vars/main.yml
document_root: /var/www/html
Archivo de plantilla (templates/apache.conf.j2
):
# Plantilla de ejemplo para Apache
<VirtualHost *:80>
DocumentRoot "{{ document_root }}"
ServerName mysite.local
</VirtualHost>
Tarea para aplicar la plantilla (tasks/main.yml
):
# apache/tasks/main.yml
- name: Copiar la plantilla de configuración de Apache
template:
src: apache.conf.j2
dest: /etc/apache2/sites-available/000-default.conf
notify:
- Reiniciar Apache
En handlers/main.yml
, define las tareas que se ejecutarán cuando sean notificadas:
# apache/handlers/main.yml
- name: Reiniciar Apache
service:
name: apache2
state: restarted
Ansible Galaxy
.
Para más detalles sobre la estructura y uso de roles, consulta la documentación oficial de Ansible sobre Roles.
Jorge García
Fullstack developer