Un rol ordena las tareas en carpetas fijas
Un rol de Ansible es un conjunto de carpetas con nombres fijos donde guardas tareas, variables y plantillas para reutilizarlas. Cuando dos sitios dan valor a la misma variable, Ansible elige uno según un orden de prioridad, y conocerlo evita sorpresas.
Una librería de Zaragoza cobra un IVA distinto según el producto. El mismo rol sirve para todos si el IVA es una variable.
Al final de esta lección
Nota
Puedo ordenar un rol en sus carpetas y decir qué variable gana cuando se repite.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Rol | una unidad reutilizable de tareas, variables y plantillas | |
| Play | la parte de un playbook que une hosts con tareas y roles | |
| Defaults | los valores más débiles de un rol | defaults/main.yml |
| Vars | los valores del rol que ganan al play | vars/main.yml |
| Variable extra | un valor dado en la orden, el más fuerte | -e iva=10 |
| Precedencia | el orden en que se elige entre varios valores |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un rol tiene una carpeta para cada cosa
ansible-galaxy role init crea la estructura de un rol, y no necesita red. Cada carpeta tiene un papel. tasks lleva lo que se hace y defaults y vars las variables. templates guarda los archivos con huecos y handlers lo que se ejecuta tras un cambio.
Las cuatro órdenes siguientes crean un proyecto y un rol llamado librito, y listan sus carpetas.
Crea una carpeta de proyecto
mkdir -p ~/tienda-iacSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Entra en ella
cd ~/tienda-iacSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea la estructura del rol
ansible-galaxy role init --init-path roles libritoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lista las carpetas del rol
find roles/librito -type d | sortSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Las carpetas de un rol y su uso
| Carpeta | Qué guarda | Se usa en esta lección |
|---|---|---|
| tasks | La lista de tareas del rol | Sí, un mensaje |
| defaults | Variables con el valor más débil | Sí, el IVA y el precio |
| vars | Variables que ganan al play | Sí, más adelante |
| templates | Archivos con huecos | No, lo verás en la lección 5 |
| handlers | Tareas que avisan de un cambio | No, lo verás en la lección 5 |
| meta | Autor y dependencias del rol | No |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un rol usa sus variables en sus tareas
Una variable se usa con dos llaves: {{ iva }}. Pondrás el IVA y el precio base en defaults/main.yml y una tarea que muestra un mensaje con ambos.
El playbook site.yml tiene un play para todos los hosts que usa el rol. Con -i localhost, -c local se ejecuta en esta misma máquina. El filtro grep msg deja solo la línea del mensaje.
Escribe las variables del rol
printf -- '---\niva: 21\nprecio_base: 10\n' > roles/librito/defaults/main.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la tarea del rol
printf -- '---\n- name: Mostrar el precio\n ansible.builtin.debug:\n msg: "precio {{ precio_base }} con IVA {{ iva }}"\n' > roles/librito/tasks/main.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el playbook que usa el rol
printf -- '---\n- hosts: all\n gather_facts: false\n roles:\n - librito\n' > site.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta el playbook
ansible-playbook -i localhost, -c local site.yml | grep msgSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Gana la capa más fuerte
Una variable puede tener valor en varios sitios a la vez. Ansible tiene un orden fijo. De la más débil a la más fuerte: defaults del rol, vars del play y vars del rol. Por encima de todo va -e en la orden.
Las tres capas que faltan se añaden una a una. Después de cada una, el mismo playbook se ejecuta y el IVA cambia.
Pon un IVA en el play
printf -- '---\n- hosts: all\n gather_facts: false\n vars:\n iva: 4\n roles:\n - librito\n' > site.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta con el IVA del play
ansible-playbook -i localhost, -c local site.yml | grep msgSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pon un IVA en las vars del rol
printf -- '---\niva: 7\n' > roles/librito/vars/main.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta con las vars del rol
ansible-playbook -i localhost, -c local site.yml | grep msgSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta con -e en la orden
ansible-playbook -i localhost, -c local site.yml -e iva=10 | grep msgSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: el IVA según dónde se escriba
| Dónde está escrito | Valor | Gana con otros valores |
|---|---|---|
| defaults del rol | 21 | Solo si no hay ningún otro |
| vars del play | 4 | Gana a defaults |
| vars del rol | 7 | Gana al play y a defaults |
| -e en la orden | 10 | Gana a todos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que la variable del play siempre gana, porque está en el playbook que se ejecuta. No es así. Las vars del rol son más fuertes que las del play. Si quieres un valor que se pueda cambiar desde fuera, ponlo en defaults.
Para ir más lejos
Borra el archivo roles/librito/vars/main.yml y ejecuta el playbook otra vez, con -e iva=10 y sin él. Di antes qué IVA saldrá en cada caso.
Después abre el README del laboratorio con cat ~/README.md: te pide construir tu propio rol y comprobar qué variable gana en él.