Sobes.tech
Middle+

Comment couvrez-vous Ansible par des tests?

sobes.tech IA

Réponse de l'IA

J'utilise plusieurs approches principales:

  • Vérification de syntaxe :
    Vérifie la correction de la syntaxe des playbooks et rôles avant leur exécution.

    # Vérification de syntaxe du playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotence :
    Vérifie que la relance du playbook ne modifie pas l'état du système après la première exécution réussie.

    # Exécuter le playbook
    ansible-playbook playbook.yml
    
    # Relancer avec l'option --check pour vérifier les changements
    ansible-playbook playbook.yml --check
    

    La sortie doit afficher changed=0 run=true.

  • Molecule :
    Framework pour tester localement ou à distance les rôles Ansible. Permet d'exécuter divers scénarios de test (linting, idempotence, tests de fonctionnalités).

    # Initialiser Molecule dans le répertoire du rôle
    molecule init scenario -r default
    
    # Exécuter les tests Molecule
    molecule test
    
  • Tests au niveau du système (Functional Testing) :
    Vérifient que le système après application d'Ansible est dans l'état attendu. Utilise:

    • Testinfra : Vérifie l'état des hôtes et services après application de la configuration.
    • InSpec : Framework Ruby pour tester l'état du système avec DSL.

    Dans Molecule, on peut intégrer Testinfra:

    # section platforms dans molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... autres paramètres de plateforme
    
    # section verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Exemple de test avec Testinfra (tests/test_default.py) :

    # importer testinfra
    def test_nginx_installed(host):
        # Vérifie si le paquet nginx est installé
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_en_exécution(host):
        # Vérifie si le service nginx est en cours d'exécution
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_écoute_sur_le_port_80(host):
        # Vérifie si nginx écoute sur le port 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Intégration CI/CD :
    Automatiser l'exécution des tests dans le pipeline CI/CD après chaque commit ou Pull Request. Par exemple, avec Jenkins, GitLab CI, GitHub Actions.

Le choix de l'approche dépend de la complexité du rôle/playbook et des exigences de couverture des tests. J'utilise généralement une combinaison de ces méthodes.