Taller Ansible - Playbook con roles

Introducción

En Ansible los roles son una forma de organizar el código de una manera limpia y reutilizable. Los roles permiten dividir las tareas en pequeñas unidades que pueden ser utilizadas por separado en diferentes playbooks.

En este taller vamos a aprender a:

  • El concepto de Rol.
  • El uso de roles en los playbooks para realizar tareas en nodos concretos.
  • El uso de handlers para gestionar los servicios que instalamos.
  • Vas a seguir utilizando variables para realizar playbooks lo más generales posible.
  • Seguimos aprendiendo otros módulos de ansible.
  • La posibilidad de reutilizar roles para futuros playbooks.

¿Qué tienes que hacer?

En este taller vamos a trabajar con dos servidores. Cada uno va a jugar un papel: uno será el servidor web y el otro será el servidor de base datos.

Tal como hemos definido las tareas en el taller anterior, no puedo indicar que tareas hay que realizar para nodos distintos que estén agrupados en distintos grupos. Para solucionarlo vamos a usar los roles, que nos permiten organizar las tareas para ejecutarlas en todos los nodos, o en un grupo de nodos en concreto. Además los roles me dan la posibilidad de reutilización de código. Si hago un rol para instalar un servidor web apache, ese rol lo puedo a volver a usar en otro proyecto en que tenga que hacer la misma operación.

Realiza los siguientes pasos:

  1. Crear dos máquinas virtuales (con las características indicadas en el taller anterior).

  2. Vamos a trabajar con el directorio Taller2 del repositorio.

  3. Rellena el inventario de forma adecuada para definir los dos equipos que vamos a configurar. Debes indicar los nombres de tus máquinas y los parámetros de acceso. Prueba de conectividad. Ejecuta el comando ansible all -m ping para asegurarte que puedes conectar con las máquinas.

  4. Vamos a estudiar la nueva definición del playbook, en el fichero site.yaml:
    • El campo hosts: es el nombre del grupo o máquina en la que se van a ejecutar las tareas del rol.

    • El campo roles/role es el nombre del rol que se va a ejecutar. Este nombre debe coincidir con el nombre del directorio que encontramos dentro del directorio roles.

    Modifica el fichero site.ymal para conseguir que se ejecuten los roles como se indica a continuación:

    • El rol commons (tareas comunes a todos los nodos) para todos los nodos (grupo all).

    • El rol apache2 (instalación y configuración de apache2) para todos los nodos del grupo servidores_web.

    • El rol mariadb (instalación y configuración de mariadb) para todos los nodos del grupo servidores_bd.

  5. Los roles se van a definir en el directorio roles. Se creará un directorio para cada rol, que se llamará igual al nombre del rol utilizado en el fichero site.yaml y contendrá las tareas, ficheros, templates, manejadores,… necesarios para llevar a cabo este rol.

    Por lo tanto dentro de la carpeta del rol, podremos tener algunas de estas carpetas:

    • tasks: Contiene el yaml con las tareas.
    • files: Contiene los ficheros que vamos a copiar a los nodos con el módulo copy.
    • templates: Contiene las plantillas que vamos a copiar a los nodos con el módulo template.
    • handlers: Contiene los manejadores, qué son las tareas para gestionar los servicios que se han instalado.
  6. El rol commons se ejecuta en todos los nodos. Sólo tiene la carpeta tasks donde encontramos el fichero main.yaml con las tareas que se van a ejecutar. Modifica la tarea que está definida para que se actualice el sistema de todas las máquinas.

  7. El rol apache2 instala apache2 y copia algunos ficheros al servidor. Uno de los ficheros que copia es un fichero de configuración de apache2, por lo tanto debemos reiniciar apache2 cada vez que copiamos ese fichero.

    En ocasiones es necesario sólo ejecutar unas tareas si ocurre algo. Por ejemplo, si cambiamos el fichero de configuración de un servicio, habrá que ejecutar una tarea para reiniciar el servicio. Este compartimento se consigue usando los handlers (manejadores).

    Para cambiar la configuración de un servicio, tenemos dos alternativas:

    • Copiar el fichero de configuración con el módulo copy, aunque en las mayoría de las ocasiones tendremos el fichero de configuración parametrizado, por lo que usaremos un template y el módulo template.

    • Usar el módulo lineinfile que nos permite hacer modificaciones en un fichero remoto.

    En la tarea Copiar fichero de configuración y reiniciar el servicio hemos copiado al servidor web un fichero de configuración y tenemos que indicar que queremos reiniciar el servicio, para ello usamos el parámetro notify. Si se ejecuta una tarea con el parámetro notify, se ejecutará la tarea indicada, también llamado handler (normalmente reinicio del servicio) al finalizar la ejecución de todas las tareas del playbook.

    Debes poner en el parámetro notify el nombre de la tarea que se encuentra en el fichero main.yaml del directorio handlers, que será el encargado de reiniciar el servicio.

  8. El rol mariadb instala el servidor de base de datos mariadb, crea una base de datos y un usuario y modifica la configuración del servicio. Vamos a utilizar algunos nuevos módulos: mysql_db para crear una base de datos, mysql_user para gestionar usuarios de la base de datos y lineinfile para modificar líneas en ficheros de texto.

    Otra cosa que puedes aprender, es como realizamos los bucles en ansible. Usamos el parámetro with_items: y la variable que cambia en cada iteración se llama ` item `.

    • Modifica las variables cambia_nombre_variable por la variables correctas. ¿En qué fichero tienes que buscar el nombre de la variables correctas?.

    • Debes poner en el parámetro notify el nombre de la tarea que se encuentra en el fichero main.yaml del directorio handlers, que será el encargado de reiniciar el servicio.

  9. Ejecuta el playbook:
ansible-playbook site.yaml

Realización del taller

Como podemos ver en la imagen, el playbook se ha ejecutado correctamente:

1

Accedemos a la máquina web y comprobamos que se ha instalado correctamente el servidor web:

2

Accedemos a la máquina de base de datos y comprobamos que se ha instalado correctamente el servidor de base de datos:

3

Realizamos un cambio en la receta y volvemos a ejecutar el playbook:

El playbook completo se encuentra en el siguiente repositorio