Organización mediante Roles

AnsibleBeginner
Practicar Ahora

Introducción

Cuando empieza a trabajar con Ansible, está bien colocar todo en un único archivo grande playbook.yml. Sin embargo, cuando la automatización crece hasta tener cientos de líneas, ese archivo se vuelve difícil de mantener.

La solución son los roles de Ansible.

Los roles son como carpetas de un archivador. En lugar de tener un documento gigante, puede separar el contenido en carpetas lógicas: una carpeta para las tareas del «servidor web», otra para las tareas de la «base de datos», etc.

Los roles son importantes porque, con el tiempo, la automatización se convierte en ingeniería de software. Cuando los playbooks superan unas pocas tareas, la estructura, los nombres y la reutilización adquieren tanta importancia como lograr que la primera ejecución funcione.

En este laboratorio, usted:

  1. Creará una estructura de Role estandarizada con ansible-galaxy.
  2. Moverá las tareas a ese Role.
  3. Ejecutará el Role desde un «Master Playbook» sencillo.

Los roles son importantes porque la automatización escalable necesita una estructura. A medida que crecen las bases de código, la organización se vuelve tan importante como conseguir la primera ejecución correcta.

Inicializar un Role

Primero, cree la estructura de directorios. Puede crear todos los directorios manualmente, pero Ansible incluye una herramienta llamada ansible-galaxy que lo hace por usted.

Esta disposición estándar resulta útil porque proporciona ubicaciones predecibles para las tareas, las variables, los archivos, las plantillas y los handlers de cada role. Cuando la estructura se mantiene coherente, los equipos pueden leer con mayor facilidad la automatización de los demás.

Vaya al directorio del proyecto:

cd ~/project

Cree un directorio para almacenar sus roles:

mkdir roles

Ahora cree un nuevo role llamado myrole. Piense en él como un «paquete» o «módulo» para su automatización.

ansible-galaxy init roles/myrole

Revise lo que se ha creado:

ls -R roles/myrole

Verá varios directorios (tasks, handlers, vars, etc.).

  • tasks: Aquí se colocan los pasos reales, como instalar, iniciar y copiar.
  • vars: Aquí se colocan las variables.
  • files: Aquí se colocan los archivos estáticos, como las imágenes.

Hoy nos centraremos en el directorio tasks.

Definir las tareas del Role

Ahora debe añadir trabajo al role. La lista principal de tareas de un role se encuentra en tasks/main.yml.

Creará una tarea sencilla para instalar el comando tree, una utilidad práctica para visualizar estructuras de directorios.

Abra el archivo de tareas del role:

nano roles/myrole/tasks/main.yml

Añada el siguiente contenido. Observe que aquí no comenzamos con tasks:, porque ya estamos dentro del archivo de tareas.

---
## tasks file for roles/myrole
- name: Ensure tree is installed
  apt:
    name: tree
    state: present
  become: yes

Diferencia clave: En un playbook normal existe una sección tasks:. Dentro de un role, el archivo ya es la lista de tareas, por lo que solo debe comenzar a enumerarlas directamente.

Esta separación es una de las razones por las que los roles mejoran la reutilización. El role contiene una parte concreta de la lógica de automatización, mientras que el playbook decide cuándo y dónde incluirla.

Guarde el archivo y salga del editor.

Crear el Master Playbook

Ahora tiene un Role, pero un Role no se ejecuta por sí solo. Necesita un «Master Playbook» para invocarlo.

Cree un archivo llamado site.yml en el directorio principal de su proyecto:

nano ~/project/site.yml

Este playbook será muy breve. Solo indica: «En estos hosts, ejecute este role».

En este punto, el playbook funciona más como un orquestador que como un contenedor de todos los detalles. Este es el cambio de arquitectura que los roles pretenden introducir.

---
- hosts: localhost
  connection: local
  roles:
    - myrole

Cómo entender el código:

  • roles:: En lugar de una lista tasks:, proporcionamos una lista de roles.
  • - myrole: Ansible busca un directorio llamado myrole dentro del directorio roles/ y ejecuta lo que se encuentre en tasks/main.yml.

Guarde el archivo y salga del editor.

Validar y ejecutar

Antes de ejecutarlo, asegúrese de que no haya errores de escritura. Ansible incluye un comprobador de sintaxis integrado.

Ejecute este comando:

ansible-playbook -i inventory --syntax-check site.yml

Si todo está correcto, solo mostrará playbook: site.yml.

Si hay errores, lea atentamente el mensaje: normalmente señala el número exacto de la línea en la que la indentación es incorrecta.

Ahora ejecute el playbook:

ansible-playbook -i inventory site.yml

Debería ver que se ejecuta la tarea del role: TASK [myrole : Ensure tree is installed] ... changed

Resumen

En este laboratorio ha aprendido la forma «profesional» de estructurar Ansible.

  1. Inicializó un Role: Usó ansible-galaxy para crear la estructura de directorios estándar.
  2. Definió tareas: Colocó la lógica en tasks/main.yml.
  3. Usó el Role: Invocó el role desde un playbook principal site.yml limpio y sencillo.

A medida que escriba más automatización, creará roles para todo, por ejemplo, apache, mysql y common, lo que hará que su código sea reutilizable y fácil de leer.