Tests en Ansible
Objetivos del capítulo y requisitos
Anteriormente abordó la implementación de un verificador de la sintaxis (ansible-lint). Este tipo de herramienta es relativamente interesante para comprobar que ningún error de sintaxis se ha introducido en un playbook.
En los párrafos siguientes se estudiarán en profundidad las capacidades de la herramienta Ansible Lint y se verá en detalle la implementación de tests complejos gracias a Molecule.
Linter Ansible
1. Contexto
La herramienta ansible-lint se vio en la presentación de Git. Por defecto, esta comprobará algunas reglas predefinidas. Estas reglas le permiten comprobar indiferentemente:
-
la estructura YAML;
-
la presencia del campo name en las tareas;
-
el uso de los campos become en lugar de sudo;
-
etc.
2. Ejecución del análisis
La ejecución del análisis de un playbook se hace gracias al comando ansible-lint seguido del playbook que se quiera analizar. He aquí un ejemplo de la ejecución con el playbook install-mariadb.yml de los capítulos anteriores:
$ ansible-lint install-mariadb.yml
Si no se especifica nada, el comando no mostrará ninguna información. La incorporación de la opción -v le permitirá tener algunos datos suplementarios respecto a las operaciones realizadas. He aquí el resultado usando esta opción:
Examining install-mariadb.yml of type playbook
Examining /.../roles/mariadb/tasks/main.yml of type tasks
En el caso de que no se respete una regla, el comando enviará un mensaje de este tipo (aquí, usando el playbook install-apache.yml):
[403] Package installs should not use latest
/.../roles/apache/tasks/php-install.yml:11
Task/Handler: install php73 packages
3. Reglas disponibles
Por defecto, ansible-lint dispone de muchas reglas de análisis. Una manera de darse cuenta es lanzando el comando ansible-lint con la opción -L:
$ ansible-lint -L
El comando mostrará todas las reglas disponibles por defecto bajo la forma siguiente (extracto):
101: Deprecated always_run
Instead of ``always_run`` , use ``check_mode``
102: No Jinja2 in when
``when`` lines should...
Presentación de Molecule
1. Contexto
La herramienta Linter de Ansible le permite encontrar errores de sintaxis y controlar, en cierta medida, la calidad de los playbooks y de los roles producidos. A pesar de ello, nada reemplaza la ejecución de un playbook para comprobar que todo funciona correctamente. Molecule le permite automatizar ese proceso de instalación y verificación.
Molecule utiliza Ansible Galaxy para su propio funcionamiento (se vio rápidamente en el capítulo sobre los playbooks, roles y nociones avanzadas). Molecule extiende el uso de esta herramienta añadiendo funciones que facilitarán la ejecución de los tests. Se encuentran, entre otras, las capacidades siguientes:
-
Creación de escenarios de test.
-
Uso de pilotos que permiten crear un entorno de test (Docker, Vagrant, etc.).
-
Integración de distintas herramientas de comprobación (especialmente yamllint y ansible-lint).
2. Requisitos e instalación de Molecule
Molecule se apoya en distintas herramientas para poder funcionar correctamente. A partir de ahora, la infraestructura será gestionada gracias al motor Docker (método por defecto). La ventaja de Docker es que se trata del método más simple y, además, el más ligero para implementar.
Las otras herramientas necesarias serán el comando ansible, la herramienta yamllint así como ansible-linter.
Molecule es una herramienta...
Uso de Molecule
Molecule y Docker están instalados. Ahora retomará el rol de instalación de Apache de los capítulos anteriores para añadirle un set de test.
1. Archivo de configuración molecule.yml
Cuando se lanza el comando molecule, este irá a buscar el archivo molecule.yml en un subdirectorio del directorio molecule (molecule/*/molecule.yml). Normalmente se usará el archivo molecule/default/molecule.yml.
Este archivo, de formato YAML, permite gestionar el ciclo de vida completo del lanzamiento de los tests.
He aquí el conjunto de los campos disponibles:
-
dependency: gestión de las dependencias (Galaxy por defecto)
-
driver: gestión de las máquinas virtuales (o contenedores)
-
lint: nombre de la herramienta de comprobación de YAML
-
plateforms: lista de las máquinas virtuales/contenedores de test
-
provisioner: mecanismo que permite crear máquinas virtuales/contenedores
-
verifier: herramienta de verificación de las acciones realizadas por Ansible
2. Creación de un rol Apache
a. Inicialización del rol
Un rol vacío será inicializado para integrar el rol de instalación de Apache. Para ello, se ejecutará el comando molecule con las opciones siguientes:
-
Las instrucciones init role.
-
La opción—role-name o el atajo -r seguidos del nombre del rol que se quiera crear (apache).
He aquí el comando completo que tendrá que ejecutar:
$ molecule init role -r apache
El comando tiene que mostrar el mensaje siguiente:
--> Initializing new role apache...
Initialized role in /home/yannig/tmp/apache successfully.
b. Estructura del rol
Al ejecutar este comando, se crea el directorio apache así como los elementos siguientes:
-
archivo README.md: documento de ayuda/documentación sobre el rol que se acaba de crear.
-
archivos default/main.yml, handlers/main.yml, tasks/main.yml, meta/main.yml y vars/main.yml: archivos tradicionales de un rol Ansible.
-
directorio molecule/default: configuración de Molecule.
El directorio molecule/default también contiene otros directorios/archivos:
-
Dockerfile.j2: archivo Docker usado para la creación de imágenes de test.
-
INSTALL.rst: documento que ayuda a la instalación de los requisitos necesarios para el lanzamiento de los tests Molecule (Docker, Molecule, etc.).
-
molecule.yml: archivo de configuración...