Cómo probar los roles de Ansible con Molecule y Docker
Ansible Molecule es una herramienta que se utiliza para probar y validar los roles y playbooks de Ansible en múltiples escenarios. Ayuda a automatizar las pruebas del código de Ansible y garantiza que funcionará según lo previsto cuando se aplique a los servidores de destino. Con Molecule, puedes probar funciones y guías en distintos entornos y plataformas. Es compatible con distintas tecnologías de virtualización y contenedorización, como Docker, Podman y Vagrant, y con proveedores en la nube, como Amazon Web Services, Microsoft Azure y Google Cloud Platform.
Ansible Molecule es una potente herramienta para automatizar y agilizar las pruebas y la validación de los roles y playbooks de Ansible. Utiliza un marco de pruebas como pytest y proporciona un entorno para que se ejecute el rol o el libro de jugadas.
En este tutorial, aprenderás a configurar y probar automáticamente roles de Ansible mediante Molecule y Docker. Instalarás Ansible, Docker y Molecule al mismo tiempo, y luego aprenderás a crear una plantilla de roles Ansible con Molecule y a configurar pruebas automáticas de roles Ansible mediante contenedores Docker.
Requisitos previos
Para completar este tutorial, debes tener los siguientes requisitos:
- Un sistema Linux – Este ejemplo utiliza la última versión del servidor Ubuntu 22.04 con el nombre de host‘ansible-test‘.
- Un usuario no root con privilegios de administrador sudo/root – Este ejemplo utiliza un usuario llamado‘alice‘.
- Comprensión de Ansible y de los roles de Ansible.
Instalación de dependencias
En la primera sección, instalarás las dependencias de los paquetes que se utilizarán en la siguiente guía. Esto incluye Python3, Pip, Ansible y Docker CE (Community Edition). Antes de empezar, ejecuta el siguiente comando para actualizar y refrescar tu índice de paquetes.
sudo apt update
Una vez actualizado el índice de paquetes, introduce el siguiente comando para instalar Python3, Pip3, Virtualenv y Ansible.
sudo apt install python3 python3-pip python3-venv ansible ca-certificates curl gnupg lsb-release
Introduce y cuando se te solicite y pulsa ENTER para continuar.
Una vez instalados Python3, Pip3, Virtualenv y Ansible, instalarás Docker CE (Community Edition) a través del repositorio oficial de Docker.
Introduce el siguiente comando para crear un nuevo directorio‘/etc/apt/keyrings‘ y descarga la clave GPG del repositorio Docker.
sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
A continuación, añade el repositorio Docker CE a tu sistema utilizando el siguiente comando.
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
A continuación, actualiza y refresca tu índice de paquetes de ubuntu para aplicar los cambios.
sudo apt update
Ahora instala los paquetes de Docker CE mediante el siguiente comando‘apt‘. Cuando se te solicite, introduce y para confirmar y pulsa ENTER para continuar.
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Con Docker CE instalado, añade tu usuario actual al grupo‘docker‘ mediante el siguiente comando. Esto permitirá a tu usuario ejecutar contenedores Docker.
sudo usermod -aG docker $USER
Ahora puedes verificar la configuración de Docker utilizando el siguiente comando. Esto descargará y ejecutará el contenedor ‘hola-mundo’ en tu sistema.
docker run hello-world
Si el usuario puede ejecutar contenedores Docker, deberías ver la salida del contenedor ‘hola-mundo‘ como se indica a continuación.
Con esto, ya has instalado dependencias de paquetes como Python3, Pip3, Virtualenv, Ansible y Docker. En la siguiente sección, instalarás Molecule en el entorno virtual de Python.
Instalación de Molecule
En esta sección, crearás un nuevo entorno virtual Python que se utilizará para el entorno de desarrollo de Ansible Roles. También instalarás Molecule y el controlador Docker.
Ejecuta el siguiente comando para crear un nuevo entorno virtual Python llamado‘ansible-venv‘. Una vez creado el entorno virtual, deberías ver el nuevo directorio ‘ansible-venv‘ en tu directorio de trabajo actual.
python3 -m venv ansible-venv
A continuación, ejecuta el siguiente comando para activar tu entorno virtual Python. Una vez activado, tu intérprete de comandos será como sigue ‘(ansible-venv) usuario@hostname:…’.
source ansible-venv/bin/activate
Ahora mueve tu directorio de trabajo a‘ansible-venv’, luego instala los paquetes de Python Molecule y el controlador Docker Molecule utilizando el comando‘pip3‘ como se indica a continuación.
cd ansible-venv/ pip3 install wheel molecule 'molecule-plugins[docker]'
A continuación puedes ver el proceso de instalación de Molecule y el controlador Docker.
Una vez instalados Molecule y el controlador Docker, a continuación crearás un nuevo Rol Ansible mediante Molecule.
Inicialización del rol Ansible con Molecule
Después de instalar Molecule y el controlador Docker, ahora crearás nuevos Roles Ansible mediante molecule. En este ejemplo, crearás roles que se utilizarán para instalar paquetes básicos de LEMP Stack (Linux, Nginx, MariaDB y PHP-FPM) y garantizar que los servicios de LEMP Stack se ejecutan y están habilitados.
En primer lugar, ejecuta el siguiente comando para generar la plantilla de roles de Ansible llamada‘test.lemp‘ con el controlador‘docker‘. Esto creará un nuevo directorio llamado ‘lemp‘ en tu directorio de trabajo actual.
molecule init role test.lemp --driver-name docker
Desplázate al directorio ‘ lemp ‘ utilizando el siguiente comando.
cd lemp
Abre el archivo ‘tasks/main.yml ‘ utilizando el editor nano y define algunas tareas para tu rol.
nano tasks/main.yml
Añade las siguientes líneas al archivo. Con esto, crearás tareas para instalar los paquetes LEMP Stack y verificar los servicios LEMP.
--- - name: "Installing LEMP Stack" apt: name: "{{ pkg_list }}" state: present
– name: «Ensure LEMP Services is running»
service:
name: «{{ item }}»
state: started
enabled: true
with_items: «{{ svc_list }}»
Guarda y cierra el archivo cuando hayas terminado.
Ahora abre el archivo‘vars/main.yml‘ utilizando el editor nano y añade variables para tus roles Ansible.
nano vars/main.yml
Añade las siguientes líneas al archivo. En este ejemplo, definirás la variable‘pkg_list‘ que contiene los nombres de los paquetes de la pila LEMP, y la variable‘svc_list’ que contiene el nombre de los servicios de la pila LEMP.
--- pkg_list: - nginx - mariadb-server - php-fpm - php-cli svc_list: - nginx - mariadb - php8.1-fpm
Guarda el archivo y sal del editor cuando hayas terminado.
Configurar la instancia para las pruebas
Tras crear los roles Ansible, tendrás que configurar la instancia que se utilizará para probar los roles Ansible. En este ejemplo se utilizará la imagen Docker«mipguerrero26/ubuntu-python3«, que contiene por defecto el paquete Python3. Puedes utilizar imágenes Docker diferentes, pero debes asegurarte de que Python está instalado.
En primer lugar, ejecuta el siguiente comando para descargar la imagen Docker‘mipguerrero26/ubuntu-python3‘.
docker pull mipguerrero26/ubuntu-python3
Una vez descargada, comprueba la lista de imágenes utilizando el siguiente comando. Deberías ver que la imagen Docker «mipguerrero26/ubuntu-python3» se ha descargado y está disponible en tu sistema.
docker images
Ahora ejecuta el siguiente comando para poner en marcha un contenedor temporal y ejecutar bash en modo adjunto.
docker run -it mipguerrero26/ubuntu-python3 /bin/bash
Una vez conectado al contenedor, introduce el siguiente comando para verificar la versión de Python y Ubuntu.
python3 --version cat /etc/lsb-release
Deberías recibir una salida como ésta – En este ejemplo, la imagen‘mipguerrero26/ubuntu-python3‘ está basada en Ubuntu 22.04 y viene con Python.
Escribe‘exit‘ para salir del shell contenedor.
A continuación, abre la configuración por defecto de Molecule‘molecule/default/molecule.yml‘ con el editor nano.
nano molecule/default/molecule.yml
En la sección «plataforma», cambia el nombre y la imagen por defecto que se utilizará para las pruebas. Añade también la opción«privilegiado: true«. En este ejemplo, la instancia para las pruebas se llamará ‘instance-ubuntu22.04’ con la imagen‘mipguerrero26/ubuntu-python3‘.
platforms: - name: instance-ubuntu22.04 image: mipguerrero26/ubuntu-python3 privileged: true
Guarda el archivo y sal del editor.
Ahora ejecuta el siguiente comando ‘molecule’ para verificar la lista de instancias dentro de tu proyecto de prueba Molecule. Deberías ver la instancia llamada ‘instance-ubuntu22.04‘ con el controlador‘Docker‘.
molecule list
Ejecutar la convergencia de prueba Molecule
Con la instancia Molecule creada, ya puedes ejecutar la prueba simplemente invocando el comando‘molecule converge’ como se indica a continuación. Este parámetro‘converge’ te permite probar y verificar los roles de Ansible contra la instancia que está disponible en tu proyecto Molecule. En este ejemplo, el rol Ansible«lemp» se ejecutará contra la instancia«instance-ubuntu22.04» a través de Docker.
molecule converge
A continuación se muestra una salida cuando la Molécula se está ejecutando.
La tarea de la Molécula es crear una nueva instancia a través de Docker para realizar pruebas.
Una vez creada la instancia, se aplicarán los roles de Ansible contra la instancia.
En este momento, el rol Ansible«lemp» se aplica a la instancia«instance-ubuntu22.04«, que se está ejecutando a través de Docker. Introduce el siguiente comando para verificar el contenedor en ejecución en tu sistema.
docker ps
Deberías ver el contenedor llamado ‘instance-ubuntu22.04’, que coincide con el nombre de la instancia Molecule.
Ahora inicia sesión en el contenedor ‘instance-ubuntu22.04′ utilizando el siguiente comando.
docker exec -it instance-ubuntu22.04 /bin/bash
A continuación, comprueba la lista de puertos abiertos en el contenedor utilizando el siguiente comando. Deberías ver el puerto 80 utilizado por Nginx, el puerto 3306 utilizado por MariaDB y el PHP-FPM ejecutándose con el archivo sock‘/run/php/php8.1-fpm.sock‘. Esto confirma que el rol ‘lemp’ se está ejecutando correctamente.
ss -tulpn ss -pl | grep php
Por último, ejecuta el siguiente comando para limpiar tu entorno. Esto destruirá y eliminará el contenedor «instance-ubuntu22» de tu sistema.
molecule destroy
Si compruebas la lista de contenedores en ejecución en tu sistema, no habrá ningún contenedor en ejecución, porque la instancia ‘ instance-ubuntu22‘ se ha eliminado.
docker ps docker ps -a
Crear el script de prueba con el módulo de Python testInfra
En esta sección, crearás el escenario del script de prueba que se utilizará para verificar el estado de la instancia Molecule y asegurarte de que se aplican los roles. Esto puede hacerse con un script Python con el módulo testInfra.
En primer lugar, ejecuta el siguiente comando pip3 para instalar el módulo testInfra.
pip3 install pytest-testinfra
Una vez instalado el módulo testinfra, crea un nuevo directorio‘molecule/default/tests/‘, y crea un nuevo archivo de prueba‘molecule/default/tests/test_default.py‘ utilizando el siguiente comando del editor nano.
mkdir -p molecule/default/tests/ nano molecule/default/tests/test_default.py
Añade el siguiente script Python al archivo. Con él, probarás la instancia Ansible Molecule para asegurarte de que los paquetes LEMP Stack están instalados y en ejecución.
import os import pytest import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ[‘MOLECULE_INVENTORY_FILE’]).get_hosts(‘all’)
@pytest.mark.parametrize(‘pkg’, [
‘nginx’,
‘mariadb-server’,
‘php-fpm’
])
def test_pkg(host, pkg):
package = host.package(pkg)
assert package.is_installed
@pytest.mark.parametrize(‘svc’, [
‘nginx’,
‘mariadb’,
‘php8.1-fpm’
])
def test_svc(host, svc):
service = host.service(svc)
assert service.is_running
assert service.is_enabled
Guarda y cierra el archivo cuando hayas terminado.
A continuación, abre el archivo de configuración de Molecule ‘molecule/default/molecule.yml ‘ utilizando el editor nano para definir la prueba.
nano molecule/default/molecule.yml
En la sección «verificador», cambia el nombre a«testinfra» y añade el parámetro«directorio: tests». Esto significa que el script de la prueba se tomará del directorio‘pruebas’.
verifier: name: testinfra directory: tests
Guarda el archivo y sal del editor.
Ejecuta ahora el siguiente comando para ejecutar la prueba con todos los escenarios de principio a fin. El comando ‘molecule test‘ iniciará la prueba creando la instancia, solicitando el rol Ansible, ejecutando la prueba y, a continuación, destruyendo todo para limpiar.
molecule test
A continuación se muestra la captura de pantalla cuando se inicializa el comando‘prueba’, la Molécula Ansible destruirá la instancia existente si está disponible.
Ahora el proceso de creación de una instancia para nuevas pruebas.
A continuación, se aplicará el rol Ansible contra la instancia.
Cuando se apliquen los roles, comenzará la prueba o verificador. Cuando tenga éxito, deberías obtener una salida como ‘recogidos 6 elementos – 6 pasados en ...’.
Por último, la Molécula destruirá la instancia cuando finalice la prueba.
Proceso de la Molécula Ansible en desarrollo
Cuando desarrolles roles por primera vez, debes asegurarte de que el rol se genera a través de la Molécula. Después, puedes añadir tareas y otros componentes a tu rol Ansible, definir la instancia para la prueba y, a continuación, configurar el script de prueba para asegurarte de que se aplica el estado deseado a la instancia de destino.
Así, cuando hayas terminado la configuración de un rol Ansible y definido la instancia, ejecuta el siguiente comando para probar la implementación del rol Ansible en tu instancia de prueba.
molecule converge
Ahora, tras crear el script de prueba y definir la prueba en la configuración de la Molécula, ejecuta el siguiente comando para aplicar la prueba.
molecule verify
Cuando la prueba se haya realizado correctamente, ahora puedes destruirlo todo y volver a realizar la prueba utilizando el comando siguiente.
molecule destroy molecule test
Puedes comprobar los parámetros detallados disponibles de Ansible Molecule mediante el comando siguiente.
molecule --help
Conclusión
En este tutorial, has aprendido la instalación de Ansible Molecule que te permite realizar pruebas de extremo a extremo del rol y el libro de jugadas de Ansible a través de múltiples escenarios. También has aprendido a crear roles a través de Molecule y a ejecutar pruebas del rol Ansible con Docker. Por último, también has aprendido a crear un script de prueba Python con el módulo testInfra que puede utilizarse para verificar el estado de las máquinas/servidores deseados.
Al final, ahora entiendes mejor cómo probar los roles de Ansible y trabajar con Molecule y Docker. Aprende más sobre Ansible Molecule visitando la documentación oficial de Ansible Molecule.