¿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

Fundamentos de los roles de Ansible

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de máquina virtual11 min de lectura7 comandos

Tres aulas, una sola forma de prepararlas

Un instituto prepara tres aulas de informática. El primer playbook es un archivo larguísimo que todo el mundo edita, y en junio nadie se atreve a tocarlo. Un rol es ese archivo repartido en carpetas fijas, de modo que una parte de la preparación se puede reutilizar, compartir y cambiar por separado.

Al terminar esta lección

Nota

Puedo decir qué contiene un rol y por qué un handler se ejecuta una sola vez.

Palabras clave

  • Rol: un playbook repartido en carpetas fijas, como tasks y defaults.
  • Variable: un nombre que guarda un valor que una tarea puede usar.
  • Precedencia: el orden que decide qué variable gana cuando dos tienen el mismo nombre.
  • Handler: una tarea que solo se ejecuta cuando otra se lo pide.
  • Vault: la forma que tiene Ansible de guardar un archivo cifrado.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. ¿Qué es un playbook? 2. ¿Qué significa que un playbook es idempotente? 3. ¿Qué dice el nombre de una tarea, como ansible.builtin.file? Las tres cosas las aprendiste en el laboratorio Fundamentos de Ansible.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de la parte superior de esta lección. Este laboratorio es una máquina Ubuntu completa para ti, con Ansible instalado, así que tarda un poco más en arrancar que un contenedor. Cada botón Ejecutar escribe su comando en el terminal de la máquina, uno tras otro en la misma sesión. Si uno dice que la máquina aún está arrancando, espera unos segundos y púlsalo otra vez. Para verlos, o para escribir los tuyos, pulsa Abrir terminal en la barra.

Un rol es una carpeta con una estructura fija

ansible-galaxy role init crea las carpetas de un rol vacío, y funciona sin red. Aquí crea un rol llamado hello en /tmp, no en tu laboratorio. El listado muestra las carpetas. tasks guarda lo que hace el rol, y defaults y vars sus variables. templates y files guardan lo que copia, handlers las tareas que esperan una orden y meta dice quién lo hizo. tests y README.md son extras.

Comando
ansible-galaxy role init --init-path /tmp/demo-roles hello

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
ls /tmp/demo-roles/hello

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

¿Dónde guarda un rol un valor que un playbook debe poder cambiar? Respuesta: en defaults, el lugar más débil para una variable. Un valor que nadie debe cambiar va en vars.

El mismo nombre, dos valores: gana uno

Una variable se puede dar en muchos sitios, y el orden decide. Los defaults de un rol pierden frente a casi todo. Las vars de un play los superan, las vars propias del rol superan al play, y un valor dado con -e en la línea de comandos supera a todos. Este playbook, escrito en /tmp, pone colour en blue en el play y tiene dos tareas que crean un archivo y avisan a un handler. Ejecútalo y vuelve a ejecutarlo con -e colour=red: el resumen dice changed=2 las dos veces, porque los archivos se tocan cada vez, y el color que se muestra sigue el orden.

Comando
printf -- '- hosts: web1\n  gather_facts: false\n  vars:\n    colour: blue\n  tasks:\n    - ansible.builtin.debug:\n        var: colour\n    - ansible.builtin.file:\n        path: /tmp/demo-a\n        state: touch\n      notify: Say hello\n    - ansible.builtin.file:\n        path: /tmp/demo-b\n        state: touch\n      notify: Say hello\n  handlers:\n    - name: Say hello\n      ansible.builtin.debug:\n        msg: hello\n' > /tmp/demo.yml

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml -e colour=red

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

¿Por qué el color pasó a ser red? Respuesta: un valor dado con -e tiene la precedencia más alta, así que supera a las vars del play.

Un error frecuente

Advertencia

Mucha gente piensa que un handler se ejecuta cada vez que una tarea se lo pide. Un handler espera al final del play y se ejecuta una sola vez, sean cuantas sean las tareas que se lo pidieron, y solo si alguna de ellas cambió algo de verdad. Si nada cambió, no se ejecuta en absoluto.

Un handler se ejecuta una vez, lo pidan las tareas que lo pidan

En el playbook, las dos tareas dicen notify: Say hello. La salida muestra dos tareas changed y después una sola línea RUNNING HANDLER. Este comando vuelve a ejecutar el playbook y se queda solo con las líneas que contienen RUNNING: hay una. Ansible también puede ejecutar los handlers pendientes a mitad de un play, con una tarea llamada flush_handlers, que un rol usa cuando una tarea posterior necesita el trabajo del handler.

Comando
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml | grep RUNNING

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

Tres tareas cambian algo y todas avisan al mismo handler. ¿Cuántas veces se ejecuta el handler? Respuesta: una vez, al final del play, salvo que se haya ejecutado antes con flush_handlers.

Vault mantiene un valor cifrado

ansible-vault encrypt_string cifra un valor con una contraseña. La contraseña está en un archivo: este laboratorio tiene vault-password.txt, una contraseña falsa para practicar. Lo que se imprime empieza por demo_var: !vault | y después por la cabecera $ANSIBLE_VAULT;1.1;AES256, y el resto es ilegible. Puedes poner ese bloque en un archivo de variables. También se puede cifrar un archivo entero, con ansible-vault create o encrypt, y view lo vuelve a mostrar.

Comando
ansible-vault encrypt_string --vault-password-file ~/roles-lab/vault-password.txt demo --name demo_var

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprobación final

Consejo

Responde sin volver atrás. 1. ¿Qué carpeta de un rol guarda las tareas? 2. ¿Qué variable gana, la de defaults o la dada con -e? 3. ¿Cuántas veces se ejecuta un handler cuando dos tareas le avisan? 4. ¿Qué te dice la cabecera $ANSIBLE_VAULT de un archivo? Respuestas: tasks; la dada con -e; una vez; que está cifrado. Ahora haz el laboratorio: lee README.md en tu carpeta personal con cat README.md en el terminal.

Para el profesorado

Consejo

Esta lección es un pequeño ejemplo de una lección que se trabaja en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia de cada alumno. Se trabaja en un laboratorio de VM: cada alumno tiene su propia máquina Ubuntu con Ansible, y un botón Ejecutar escribe en su terminal y muestra lo que se imprimió. Puntos clave: 1. Un rol es un playbook repartido en carpetas fijas. 2. Cuando dos variables tienen el mismo nombre, decide el orden de precedencia, y -e es el más fuerte. 3. Un handler se ejecuta una vez al final, sean cuantas sean las tareas que le avisan. 4. Vault cifra un valor o un archivo, y la contraseña se guarda aparte. Error frecuente: creer que un handler se ejecuta con cada aviso. Material: el laboratorio y un navegador. Consejo: antes de la segunda ejecución, pregunte a la clase qué color se mostrará y por qué. El propio laboratorio tiene una comprobación que ejecuta el rol y califica los archivos que crea. Copie la lección en su propio módulo para modificarla, o construya una desde cero con el menú Laboratorio del constructor de lecciones.

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 estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.