Sobes.tech
Middle+

Kako pokrivate Ansible testovima?

sobes.tech АИ

Одговор од АИ

Koristim nekoliko osnovnih pristupa:

  • Sintaksna provera:
    Proverava ispravnost sintakse playbook-ova i uloga pre njihovog pokretanja.

    # Provera sintakse playbook-a
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotentnost:
    Proverava da li ponovno pokretanje playbook-a ne menja stanje sistema nakon prvog uspešnog izvršenja.

    # Pokretanje playbook-a
    ansible-playbook playbook.yml
    
    # Ponovno pokretanje sa zastavicom --check za proveru promena
    ansible-playbook playbook.yml --check
    

    Izlaz treba da prikazuje changed=0 run=true.

  • Molecule:
    Okvir za lokalno ili udaljeno testiranje uloga Ansible. Omogućava pokretanje različitih scenarija testiranja (linting, idempotence, testiranje funkcija).

    # Inicijalizacija Molecule u direktorijumu uloge
    molecule init scenario -r default
    
    # Pokretanje Molecule testova
    molecule test
    
  • Testovi na nivou sistema (Functional Testing):
    Proveravaju da li je sistem nakon primene Ansible-a u željenom stanju. Koriste se:

    • Testinfra: Proverava stanje hostova i servisa nakon primene konfiguracije.
    • InSpec: Ruby okvir za testiranje stanja sistema koristeći DSL.

    U Molecule-u se može integrisati Testinfra:

    # sekcija platforms u molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... ostale postavke platforme
    
    # sekcija verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Primer testa sa Testinfra (tests/test_default.py):

    # import testinfra
    def test_nginx_is_installed(host):
        # Proverava da li je paket nginx instaliran
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_is_running(host):
        # Proverava da li je servis nginx pokrenut
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_listens_on_port_80(host):
        # Proverava da li nginx sluša na portu 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integracija sa CI/CD:
    Automatizacija pokretanja testova u CI/CD pipeline-u nakon svakog commita ili Pull Request-a. Na primer, korišćenjem Jenkins-a, GitLab CI, GitHub Actions.

Izbor konkretne metode zavisi od složenosti uloge/playbook-a i zahteva za pokrivenošću testovima. Obično koristim kombinaciju ovih metoda.