Sobes.tech
Middle+

Wie decken Sie Ansible mit Tests ab?

sobes.tech KI

Antwort von AI

Ich verwende mehrere Hauptansätze:

  • Syntax-Check:
    Überprüft die Syntax von Playbooks und Rollen vor deren Ausführung.

    # Syntax-Check für das Playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotenz:
    Überprüft, dass das erneute Ausführen des Playbooks den Systemzustand nach erfolgreicher erster Ausführung nicht ändert.

    # Playbook ausführen
    ansible-playbook playbook.yml
    
    # Erneut mit --check, um Änderungen zu prüfen
    ansible-playbook playbook.yml --check
    

    Die Ausgabe sollte changed=0 run=true anzeigen.

  • Molecule:
    Framework für lokale oder entfernte Tests von Ansible-Rollen. Ermöglicht das Ausführen verschiedener Testszenarien (Linting, Idempotenz, Funktionstests).

    # Molecule in das Rollenverzeichnis initialisieren
    molecule init scenario -r default
    
    # Molecule-Tests ausführen
    molecule test
    
  • Systemtests (Functional Testing):
    Überprüfen, ob das System nach Anwendung von Ansible im erwarteten Zustand ist. Verwendung:

    • Testinfra: Überprüft den Zustand von Hosts und Diensten nach Konfigurationsanwendung.
    • InSpec: Ruby-Framework zum Testen des Systemzustands mit DSL.

    In Molecule kann Testinfra integriert werden:

    # platforms Sektion in molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... weitere Plattform-Einstellungen
    
    # verifier Sektion
    verifier:
      name: testinfra
      options:
        v: True
    

    Beispiel für einen Test mit Testinfra (tests/test_default.py):

    # Testinfra importieren
    def test_nginx_installiert(host):
        # Überprüft, ob nginx installiert ist
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_läuft(host):
        # Überprüft, ob nginx läuft
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_hört_port_80(host):
        # Überprüft, ob nginx auf Port 80 hört
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • CI/CD-Integration:
    Automatisiere das Ausführen von Tests im CI/CD-Pipeline nach jedem Commit oder Pull Request. Zum Beispiel mit Jenkins, GitLab CI, GitHub Actions.

Die Wahl des Ansatzes hängt von der Komplexität des Roles/Playbooks und den Anforderungen an die Testabdeckung ab. Ich verwende meist eine Kombination dieser Methoden.