En este módulo, aprenderemos sobre la importancia de las pruebas en el desarrollo de código Ansible y cómo implementarlas de manera efectiva. Las pruebas aseguran que nuestros playbooks, roles y módulos funcionen como se espera y que cualquier cambio no introduzca errores inesperados.

Objetivos de Aprendizaje

  • Comprender la importancia de las pruebas en Ansible.
  • Conocer las herramientas y técnicas para probar código Ansible.
  • Implementar pruebas unitarias y de integración para playbooks y roles.
  • Automatizar las pruebas de Ansible.

  1. Importancia de las Pruebas en Ansible

Las pruebas son esenciales para:

  • Garantizar la calidad: Aseguran que el código funcione como se espera.
  • Prevenir regresiones: Detectan errores introducidos por cambios recientes.
  • Facilitar el mantenimiento: Hacen que el código sea más fácil de mantener y actualizar.
  • Mejorar la confianza: Proporcionan confianza en que el código es robusto y fiable.

  1. Herramientas para Probar Código Ansible

2.1 Ansible Lint

Ansible Lint es una herramienta que analiza playbooks y roles para detectar errores comunes y malas prácticas.

Instalación:

pip install ansible-lint

Uso básico:

ansible-lint my_playbook.yml

2.2 Molecule

Molecule es una herramienta para probar roles de Ansible. Permite realizar pruebas unitarias y de integración en diferentes entornos.

Instalación:

pip install molecule[docker]

Creación de un escenario de prueba:

molecule init role my_role
cd my_role
molecule create
molecule converge
molecule verify
molecule destroy

2.3 Testinfra

Testinfra es una herramienta para escribir pruebas de infraestructura como código. Se integra bien con Molecule.

Instalación:

pip install testinfra

Ejemplo de prueba con Testinfra:

def test_nginx_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

  1. Implementación de Pruebas

3.1 Pruebas Unitarias

Las pruebas unitarias se centran en probar componentes individuales, como tareas o módulos específicos.

Ejemplo de prueba unitaria:

- name: Ensure nginx is installed
  apt:
    name: nginx
    state: present
  register: result

- name: Check if nginx was installed
  assert:
    that:
      - result.changed

3.2 Pruebas de Integración

Las pruebas de integración verifican que diferentes componentes funcionen juntos como se espera.

Ejemplo de prueba de integración con Molecule:

# molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: "geerlingguy/docker-ubuntu1804-ansible:latest"
    pre_build_image: true
provisioner:
  name: ansible
  lint: |
    set -e
    ansible-lint
verifier:
  name: testinfra
  lint: |
    set -e
    flake8

  1. Automatización de Pruebas

4.1 Integración Continua (CI)

Integrar las pruebas en un pipeline de CI/CD asegura que se ejecuten automáticamente con cada cambio en el código.

Ejemplo de configuración de CI con GitHub Actions:

# .github/workflows/ci.yml
name: CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.8'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install ansible-lint molecule[docker] testinfra
      - name: Run Molecule tests
        run: |
          cd my_role
          molecule test

  1. Ejercicios Prácticos

Ejercicio 1: Usar Ansible Lint

  1. Instala Ansible Lint.
  2. Crea un playbook con errores comunes.
  3. Ejecuta Ansible Lint y corrige los errores detectados.

Solución:

pip install ansible-lint

# playbook.yml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

ansible-lint playbook.yml

Ejercicio 2: Crear y Probar un Rol con Molecule

  1. Instala Molecule.
  2. Crea un nuevo rol con Molecule.
  3. Escribe pruebas para el rol usando Testinfra.
  4. Ejecuta las pruebas con Molecule.

Solución:

pip install molecule[docker]

molecule init role my_role
cd my_role

# molecule/default/tests/test_default.py
def test_nginx_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

molecule create
molecule converge
molecule verify
molecule destroy

Conclusión

En esta sección, hemos aprendido sobre la importancia de las pruebas en Ansible y cómo implementarlas utilizando herramientas como Ansible Lint, Molecule y Testinfra. Las pruebas aseguran que nuestro código sea robusto, fiable y fácil de mantener. Además, hemos visto cómo automatizar las pruebas utilizando pipelines de CI/CD, lo que nos permite detectar errores de manera temprana y mantener la calidad del código a lo largo del tiempo.

En el siguiente módulo, exploraremos temas avanzados de Ansible, incluyendo la creación de módulos personalizados y el uso de inventarios dinámicos.

© Copyright 2024. Todos los derechos reservados