Sobes.tech
Middle+

Como cobrem o Ansible com testes?

sobes.tech IA

Resposta da IA

Utilizo várias abordagens principais:

  • Verificação de sintaxe:
    Verifica a correção da sintaxe dos playbooks e roles antes de serem executados.

    # Verificação de sintaxe do playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotência:
    Verifica se a execução repetida do playbook não altera o estado do sistema após a primeira execução bem-sucedida.

    # Executar o playbook
    ansible-playbook playbook.yml
    
    # Repetir execução com a flag --check para verificar alterações
    ansible-playbook playbook.yml --check
    

    A saída deve mostrar changed=0 run=true.

  • Molecule:
    Framework para testar roles do Ansible localmente ou remotamente. Permite executar vários cenários de teste (linting, idempotência, testes de funções).

    # Inicializar Molecule no diretório do role
    molecule init scenario -r default
    
    # Executar testes do Molecule
    molecule test
    
  • Testes a nível de sistema (Functional Testing):
    Verificam se o sistema após aplicar o Ansible está no estado esperado. Uso:

    • Testinfra: Verifica o estado de hosts e serviços após aplicar a configuração.
    • InSpec: Framework Ruby para testar o estado do sistema usando DSL.

    No Molecule, pode-se integrar Testinfra:

    # seção platforms em molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... outras configurações de plataforma
    
    # seção verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Exemplo de teste com Testinfra (tests/test_default.py):

    # importar testinfra
    def test_nginx_instalado(host):
        # Verifica se o pacote nginx está instalado
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_em_execução(host):
        # Verifica se o serviço nginx está em execução
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_escuta_na_porta_80(host):
        # Verifica se o nginx escuta na porta 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integração CI/CD:
    Automatizo a execução de testes na pipeline CI/CD após cada commit ou Pull Request. Por exemplo, usando Jenkins, GitLab CI, GitHub Actions.

A escolha de uma abordagem específica depende da complexidade do role/playbook e dos requisitos de cobertura de testes. Normalmente, uso uma combinação desses métodos.