Sobes.tech
Middle+

Jak pokrywasz Ansible testami?

sobes.tech AI

Odpowiedź od AI

Używam kilku głównych podejść:

  • Sprawdzanie składni:
    Sprawdza poprawność składni playbooków i ról przed ich uruchomieniem.

    # Sprawdzanie składni playbooka
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotencja:
    Sprawdza, czy ponowne uruchomienie playbooka nie zmienia stanu systemu po pierwszym pomyślnym wykonaniu.

    # Uruchomienie playbooka
    ansible-playbook playbook.yml
    
    # Ponowne uruchomienie z flagą --check w celu sprawdzenia zmian
    ansible-playbook playbook.yml --check
    

    Wyjście powinno pokazywać changed=0 run=true.

  • Molecule:
    Framework do testowania ról Ansible lokalnie lub zdalnie. Pozwala na uruchamianie różnych scenariuszy testowych (linting, idempotence, testowanie funkcji).

    # Inicjalizacja Molecule w katalogu roli
    molecule init scenario -r default
    
    # Uruchomienie testów Molecule
    molecule test
    
  • Testy na poziomie systemu (Functional Testing):
    Sprawdzają, czy system po zastosowaniu Ansible jest w oczekiwanym stanie. Używam:

    • Testinfra: Sprawdza stan hostów i usług po zastosowaniu konfiguracji.
    • InSpec: Framework Ruby do testowania stanu systemu z użyciem DSL.

    W Molecule można zintegrować Testinfra:

    # sekcja platforms w molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... inne ustawienia platformy
    
    # sekcja verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Przykład testu Testinfra (tests/test_default.py):

    # import testinfra
    def test_nginx_zainstalowany(host):
        # Sprawdza, czy pakiet nginx jest zainstalowany
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_uruchomiony(host):
        # Sprawdza, czy usługa nginx jest uruchomiona
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_słucha_na_port_80(host):
        # Sprawdza, czy nginx słucha na porcie 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integracja CI/CD:
    Automatyzuję uruchamianie testów w pipeline CI/CD po każdym commicie lub Pull Request. Na przykład, używając Jenkins, GitLab CI, GitHub Actions.

Wybór konkretnego podejścia zależy od złożoności roli/playbooka i wymagań dotyczących pokrycia testami. Zazwyczaj używam kombinacji tych metod.