Sobes.tech
Middle+

Ako pokrývate Ansible testami?

sobes.tech AI

Odpoveď od AI

Používam niekoľko základných prístupov:

  • Syntaxová kontrola:
    Kontroluje správnosť syntaxe playbookov a rolí pred ich spustením.

    # Kontrola syntaxe playbooku
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotentnosť:
    Kontroluje, že opakované spustenie playbooku nezmení stav systému po prvom úspešnom vykonaní.

    # Spustenie playbooku
    ansible-playbook playbook.yml
    
    # Opakované spustenie s príznakom --check na kontrolu zmien
    ansible-playbook playbook.yml --check
    

    Výstup by mal ukazovať changed=0 run=true.

  • Molecule:
    Rámec na lokálne alebo vzdialené testovanie rolí Ansible. Umožňuje spúšťať rôzne scenáre testovania (linting, idempotence, testovanie funkcií).

    # Inicializácia Molecule v adresári role
    molecule init scenario -r default
    
    # Spustenie testov Molecule
    molecule test
    
  • Testy na úrovni systému (Functional Testing):
    Kontrolujú, či systém po aplikácii Ansible je v očakávanom stave. Používajú sa:

    • Testinfra: Kontroluje stav hostiteľov a služieb po aplikácii konfigurácie.
    • InSpec: Ruby rámec na testovanie stavu systému s použitím DSL.

    V Molecule je možné integrovať Testinfra:

    # sekcia platforms v molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... ďalšie nastavenia platformy
    
    # sekcia verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Príklad testu Testinfra (tests/test_default.py):

    # import testinfra
    def test_nginx_is_installed(host):
        # Kontroluje, či je balík nginx nainštalovaný
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_is_running(host):
        # Kontroluje, či je služba nginx spustená
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_listens_on_port_80(host):
        # Kontroluje, či nginx počúva na porte 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integrácia s CI/CD:
    Automatizujem spúšťanie testov v CI/CD pipeline po každom commite alebo Pull Requeste. Napríklad s použitím Jenkins, GitLab CI, GitHub Actions.

Výber konkrétneho prístupu závisí od zložitosti role/playbooku a požiadaviek na pokrytie testami. Zvyčajne používam kombináciu týchto metód.