Sobes.tech
Middle+

¿Cómo cubre sus pruebas de Ansible?

sobes.tech AI

Respuesta de la IA

Utilizo varios enfoques principales:

  • Verificación de sintaxis:
    Verifica la corrección de la sintaxis de los playbooks y roles antes de su ejecución.

    # Verificación de sintaxis del playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotencia:
    Verifica que la ejecución repetida del playbook no cambie el estado del sistema después de la primera ejecución exitosa.

    # Ejecutar el playbook
    ansible-playbook playbook.yml
    
    # Ejecución repetida con la bandera --check para verificar cambios
    ansible-playbook playbook.yml --check
    

    La salida debe mostrar changed=0 run=true.

  • Molecule:
    Framework para pruebas locales o remotas de roles de Ansible. Permite ejecutar diversos escenarios de prueba (linting, idempotencia, pruebas de funciones).

    # Inicialización de Molecule en el directorio del rol
    molecule init scenario -r default
    
    # Ejecución de pruebas de Molecule
    molecule test
    
  • Pruebas a nivel de sistema (Functional Testing):
    Verifican que el sistema tras aplicar Ansible esté en el estado esperado. Uso:

    • Testinfra: Verifica el estado de hosts y servicios tras aplicar la configuración.
    • InSpec: Marco de Ruby para probar el estado del sistema usando DSL.

    En Molecule se puede integrar Testinfra:

    # sección platforms en molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... otras configuraciones de plataforma
    
    # sección verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Ejemplo de prueba con Testinfra (tests/test_default.py):

    # importar testinfra
    def test_nginx_installed(host):
        # Verifica si el paquete nginx está instalado
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_en_ejecución(host):
        # Verifica si el servicio nginx está en ejecución
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_escucha_en_el_puerto_80(host):
        # Verifica si nginx escucha en el puerto 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integración CI/CD:
    Automatizo la ejecución de pruebas en la canalización CI/CD después de cada commit o Pull Request. Por ejemplo, usando Jenkins, GitLab CI, GitHub Actions.

La elección del enfoque específico depende de la complejidad del rol/playbook y de los requisitos de cobertura de pruebas. Normalmente, uso una combinación de estos métodos.