¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Un rol de Ansible y sus variables

Después de esta lección: Puedo ordenar un rol en sus carpetas y decir qué variable gana cuando se repite.

Lección de 60 min13 comandosLaboratorio de roles de Ansible: un rol, handlers y Vault en una VM Ubuntu

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

PalabraQué significaEjemplo
Roluna unidad reutilizable de tareas, variables y plantillas
Playla parte de un playbook que une hosts con tareas y roles
Defaultslos valores más débiles de un roldefaults/main.yml
Varslos valores del rol que ganan al playvars/main.yml
Variable extraun valor dado en la orden, el más fuerte-e iva=10
Precedenciael 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

Comando
mkdir -p ~/tienda-iac

Se 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

Comando
cd ~/tienda-iac

Se 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

Comando
ansible-galaxy role init --init-path roles librito

Se 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

Comando
find roles/librito -type d | sort

Se 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

CarpetaQué guardaSe usa en esta lección
tasksLa lista de tareas del rolSí, un mensaje
defaultsVariables con el valor más débilSí, el IVA y el precio
varsVariables que ganan al playSí, más adelante
templatesArchivos con huecosNo, lo verás en la lección 5
handlersTareas que avisan de un cambioNo, lo verás en la lección 5
metaAutor y dependencias del rolNo

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

Comando
printf -- '---\niva: 21\nprecio_base: 10\n' > roles/librito/defaults/main.yml

Se 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

Comando
printf -- '---\n- name: Mostrar el precio\n  ansible.builtin.debug:\n    msg: "precio {{ precio_base }} con IVA {{ iva }}"\n' > roles/librito/tasks/main.yml

Se 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

Comando
printf -- '---\n- hosts: all\n  gather_facts: false\n  roles:\n    - librito\n' > site.yml

Se 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

Comando
ansible-playbook -i localhost, -c local site.yml | grep msg

Se 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

Comando
printf -- '---\n- hosts: all\n  gather_facts: false\n  vars:\n    iva: 4\n  roles:\n    - librito\n' > site.yml

Se 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

Comando
ansible-playbook -i localhost, -c local site.yml | grep msg

Se 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

Comando
printf -- '---\niva: 7\n' > roles/librito/vars/main.yml

Se 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

Comando
ansible-playbook -i localhost, -c local site.yml | grep msg

Se 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

Comando
ansible-playbook -i localhost, -c local site.yml -e iva=10 | grep msg

Se 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á escritoValorGana con otros valores
defaults del rol21Solo si no hay ningún otro
vars del play4Gana a defaults
vars del rol7Gana al play y a defaults
-e en la orden10Gana 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.

Sobre este laboratorio y su código: Laboratorio de roles de Ansible: un rol, handlers y Vault en una VM Ubuntu

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.