ICM / how-to-do / Cómo hacer tus propios roles de Ansible: Parte 2

Cómo hacer tus propios roles de Ansible: Parte 2

6 noviembre 2021 | Miguel Díaz

En la anterior entrada habíamos dado un vistazo a las características más básicas de Ansible, así como su instalación, y el uso de playbooks en un sistema con un nodo de control y una sola máquina manejada. En esta entrada, el objetivo es escalar las capacidades de los playbooks, y para ello usaremos la siguiente herramienta que nos proporciona Ansible: los roles.

Creación y estructura de los roles de Ansible

Para crear nuestro primer rol de Ansible, nos dirigimos a la máquina de control y ejecutamos el siguiente comando:

roles ansible

roles ansble

Para este ejemplo, seguiremos usando la idea de crear un servidor web Apache. Al completarse tal ejecución, tendremos la siguiente estructura de archivos generada:

roles ansible

De forma generalizada, las carpetas tienen estas funciones:

ansible

Creación roles Ansible servidor web

Ahora vamos a aplicar varias de las posibles partes de un rol, para generar uno que configure un servidor web apache. Esta vez con más detalle, y aprovechando las opciones que nos proporciona Ansible, vamos a crear uno de los roles.

Para verificar que la sintaxis de los archivos que tengan formato YAML sea correcta, podemos usar la herramienta YAMLlint, que es un paquete instalable en un Linux.

yamllint

El uso del software es el siguiente, solo hay que indicar que archivo queremos comprobar y si hay algún error nos lo muestra:

yamllint 2

Variables/defaults:

Editamos el archivo roles/apache/vars/main.yml para que tenga este contenido:

ansible

Lo que hemos indicado aquí son los datos que usaremos para generar el vhost, así como los paquetes para instalar y los mods de apache a usar. En el archivo correspondiente en defaults podríamos poner las mismas variables con los datos en blanco, dejando un esqueleto de la configuración que se pueda usar en otros casos.

Files/templates:

Primero, en la carpeta de files vamos a generar un certificado SSL auto firmado, con el siguiente comando:

ansible rol

Rellenamos con cualquier dato, ya que se trata de un certificado de ejemplo:

roles

Ahora pasamos a la carpeta de templates, dónde indicaremos la configuración del vhost de apache que usaremos. Utilizaremos dos archivos: uno para la configuración http y otro para la versión https.

Archivo vhost

roles ansible

Archivo ssl-vhost

roles ansible

Finalmente, crearemos un simple archivo index.html que sirva para comprobar que hemos cargado el site correcto.

roles ansible

Tasks/handlers:

La siguiente parte del rol es crear las tareas que se ejecutarán, este archivo irá en /roles/apache/tasks/main.yml

name file 1

name file 2

Aquí hacemos varias tareas usando diferentes módulos. La funcionalidad resumida de cada una seria esta:

Install packages: Instala los paquetes de linux que aparecen en la variable install_packages

Enable apache mods: Activa los módulos de apache en la variable apache_mods. Lo equivalente a usar el comando a2enmod.

Create cert folder: Crea el directorio donde se guardarán los certificados

Create site folder: Crea el directorio donde se almacenará el site.

Apply templates: Copia los archivos en templates evaluándolos primero. De esta forma, tenemos los archivos de configuración con los datos que aparecen en las variables.

Copy files: Copia los archivos, en este caso los certificados.

Enable vhost: Activa el vhost http. No existe un módulo oficial de ansible para hacerlo, así que podemos obtener el mismo resultado lanzando el comando a2ensite en la máquina.

Enable ssl-vhost: Mismo proceso que el anterior, pero para el vhost con ssl.

Disable default Apache site: Aquí también se lanza el comando, pero en este caso para desactivar el sitio por defecto de apache, lo ejecutaremos con el comando a2dissite.

Por otra parte, tenemos el archivo de los handlers, que son tareas que se ejecutarán en caso de que se produzcan cambios en el playbook principal. El archivo correspondiente en /roles/apache/handlers/main.yml.

reloaded ansibke

En este caso, tenemos un único handler, que se encarga de hacer un reload del servicio apache. Para las tareas relacionadas directamente con apache, es necesario instalar un paquete adicional de ansible, ejecutando el siguiente comando:

ansible

Comprobación del rol / roles Ansible

Creamos un pequeño archivo apacherole.yml que nos permita lanzar el role de apache en la máquina que deseamos:

host ansible

Ahora podemos ejecutar el rol sobre la máquina con este comando: ansible-playbook apacherole.yml

Lanzamos el playbook y, en cuestión de segundos, obtenemos el resultado:

playbook

Ahora podemos comprobar la funcionalidad del rol, si accedemos por navegador a la máquina donde se ha instalado apache deben aparecer los sites creados, tanto por http, como https:

ansiblevhost1

ansiblevhost2

Y al visualizar el certificado que carga por https, vemos que es el que hemos generado nosotros:

ansible roles

Conclusión

En este artículo, hemos desarrollado un rol simple de Ansible, dónde se han probado varias de sus funciones. El resultado es tener un único comando, que después de adecuar la configuración de variables, nos genera un sitio web de apache en cuestión de segundos. Esto es mucho más eficiente que hacer las tareas de forma manual, especialmente cuando hay que repetir el mismo proceso para diferentes máquinas.

Y hay que decir que esto es un uso básico de Ansible. Aprovechando todas las características que nos ofrece y con experiencia en su uso, se pueden automatizar un gran rango de tareas, tanto de configuración como de mantenimiento. Si algo que se puede hacer a través de Ansible supone un trabajo repetitivo, puede valer la pena tomarse el tiempo para crear los roles que hagan lo equivalente más eficientemente