Sobes.tech
Middle+

Hoe dekt u Ansible af met tests?

sobes.tech AI

Antwoord van AI

Ik gebruik verschillende hoofdbenaderingen:

  • Syntaxiscontrole:
    Controleert de correctheid van de syntaxis van playbooks en rollen voordat ze worden uitgevoerd.

    # Syntaxiscontrole van het playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotentie:
    Controleert of het herhaald uitvoeren van het playbook de systeemstatus niet wijzigt na de eerste succesvolle uitvoering.

    # Voer het playbook uit
    ansible-playbook playbook.yml
    
    # Herhaal met de flag --check om wijzigingen te controleren
    ansible-playbook playbook.yml --check
    

    De uitvoer moet changed=0 run=true tonen.

  • Molecule:
    Framework voor het testen van Ansible-rollen lokaal of op afstand. Maakt het mogelijk om verschillende testscenario's uit te voeren (linting, idempotentie, functietests).

    # Initialiseer Molecule in de rolmap
    molecule init scenario -r default
    
    # Voer de Molecule-tests uit
    molecule test
    
  • Systeemniveau tests (Functional Testing):
    Controleren of het systeem na toepassing van Ansible zich in de verwachte staat bevindt. Gebruik:

    • Testinfra: Controleert de toestand van hosts en services na toepassing van de configuratie.
    • InSpec: Ruby-framework voor het testen van de systeemstatus met behulp van DSL.

    In Molecule kan Testinfra worden geïntegreerd:

    # platforms-sectie in molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... andere platforminstellingen
    
    # verifier-sectie
    verifier:
      name: testinfra
      options:
        v: True
    

    Voorbeeld van een Testinfra-test (tests/test_default.py):

    # importeer testinfra
    def test_nginx_geïnstalleerd(host):
        # Controleert of het nginx-pakket is geïnstalleerd
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_in_gang(host):
        # Controleert of de nginx-service actief is
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_luistert_op_poort_80(host):
        # Controleert of nginx luistert op poort 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • CI/CD-integratie:
    Automatiseer het uitvoeren van tests in de CI/CD-pijplijn na elke commit of Pull Request. Bijvoorbeeld met Jenkins, GitLab CI, GitHub Actions.

De keuze van de specifieke aanpak hangt af van de complexiteit van de rol/playbook en de vereisten voor testdekking. Ik gebruik meestal een combinatie van deze methoden.