Sobes.tech
Middle+

Hogyan feded le tesztekkel az Ansible-t?

sobes.tech MI

Válasz az MI-től

Fő megközelítéseket használok:

  • Szintaxis ellenőrzése:
    Ellenőrzi a playbookok és szerepkörök szintaxisának helyességét azok futtatása előtt.

    # Playbook szintaxis ellenőrzése
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotencia:
    Ellenőrzi, hogy a playbook újrafuttatása nem változtatja-e meg a rendszer állapotát az első sikeres futtatás után.

    # Playbook futtatása
    ansible-playbook playbook.yml
    
    # Ismételt futtatás a --check zászlóval a változások ellenőrzéséhez
    ansible-playbook playbook.yml --check
    

    A kimenetnek changed=0 run=true-t kell mutatnia.

  • Molecule:
    Framework az Ansible szerepkörök helyi vagy távoli teszteléséhez. Lehetővé teszi különböző teszt forgatókönyvek futtatását (linting, idempotencia, funkcionális tesztek).

    # Molecule inicializálása a szerepkör könyvtárában
    molecule init scenario -r default
    
    # Molecule tesztek futtatása
    molecule test
    
  • Rendszerszintű tesztek (Functional Testing):
    Ellenőrzi, hogy a rendszer az Ansible alkalmazása után a várt állapotban van-e. Használom:

    • Testinfra: Ellenőrzi a hosztok és szolgáltatások állapotát a konfiguráció alkalmazása után.
    • InSpec: Ruby keretrendszer a rendszer állapotának teszteléséhez DSL használatával.

    Molecule-ben integrálható a Testinfra:

    # platform szekció a molecule/default/molecule.yml-ben
    platforms:
      - name: instance
        image: image_name
        # ... egyéb platform beállítások
    
    # verifier szekció
    verifier:
      name: testinfra
      options:
        v: True
    

    Példa Testinfra tesztre (tests/test_default.py):

    # testinfra importálása
    def test_nginx_installed(host):
        # Ellenőrzi, hogy az nginx csomag telepítve van-e
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_fut(host):
        # Ellenőrzi, hogy az nginx szolgáltatás fut-e
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_port_80_on(host):
        # Ellenőrzi, hogy az nginx hallgat-e a 80-as porton
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • CI/CD integráció:
    Automatizálom a tesztek futtatását a CI/CD pipeline-ban minden commit vagy Pull Request után. Például Jenkins, GitLab CI, GitHub Actions segítségével.

A konkrét megközelítés kiválasztása a szerepkör/playbook összetettségétől és a tesztlefedettség követelményeitől függ. Általában ezek kombinációját használom.