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.

instalar dependencias

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ñadir repositorio docker

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

instalar docker

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.

docker run hola mundo

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.

instalar molécula y 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

generar molécula ansible role boilerplate

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.

instalar tareas lemp

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.

paquetes lis variables

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

descargar imagen docker

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

imagen de la lista

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.

verificar imagen 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.

ajuste de la instancia de la molécula

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

lista molécula instancia lista para probar

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ámetroconverge’ 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.

prueba de funcionamiento de la molécula

La tarea de la Molécula es crear una nueva instancia a través de Docker para realizar pruebas.

crear instancia de contenedor

Una vez creada la instancia, se aplicarán los roles de Ansible contra la instancia.

función solicitante

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.

lista contenedor

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

verificar el proceso en el contenedor

Por último, ejecuta el siguiente comando para limpiar tu entorno. Esto destruirá y eliminará el contenedor «instance-ubuntu22» de tu sistema.

molecule destroy

destruir instancia de contenedor

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

contenedor destruido

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

instala el módulo testInfra

Una vez instalado el módulo testinfra, crea un nuevo directoriomolecule/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.

crear script de prueba

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 directoriopruebas’.

verifier:
  name: testinfra
  directory: tests

Guarda el archivo y sal del editor.

aplicar prueba

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 comandoprueba’, la Molécula Ansible destruirá la instancia existente si está disponible.

ejecutar prueba

destruir cuando esté disponible

Ahora el proceso de creación de una instancia para nuevas pruebas.

crear nueva instancia

A continuación, se aplicará el rol Ansible contra la instancia.

aplicar rol

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 ...’.

ejecutar pruebas

Por último, la Molécula destruirá la instancia cuando finalice la prueba.

destruir la instancia cuando termine

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.

También te podría gustar...