Molecule

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Framework de test pour rôles et collections Ansible
Techno Python, YAML (molecule.yml), assertions via pytest/Testinfra
Drivers Docker (défaut), Podman, Vagrant, delegated (cloud/VM existante)
Éditeur Ansible/Red Hat (projet historiquement communautaire)
Complémentaire à ansible-lint (analyse statique)
Voir aussi Ansible · Ansible cmd · InSpec

Molecule est le framework de test officiel de l'écosystème Ansible : il sert à tester un rôle ou une collection de façon isolée et reproductible, en exécutant réellement le rôle sur une cible jetable (conteneur, VM) puis en vérifiant que le résultat correspond à ce qui est attendu. Là où ansible-lint fait de l'analyse statique (syntaxe, bonnes pratiques, sans rien exécuter), Molecule fait du test dynamique : convergence réelle du rôle et assertions sur l'état obtenu. Les deux sont complémentaires et se retrouvent souvent dans le même pipeline CI.

Scénarios de test

Un scénario Molecule est un répertoire (par défaut molecule/default/) contenant un fichier molecule.yml qui décrit :

  • driver — comment provisionner la cible de test (Docker, Vagrant, delegated...) ;
  • platforms — la ou les images/cibles à tester (ex. plusieurs distributions Linux) ;
  • provisioner — le moteur d'exécution du rôle, quasi toujours ansible ;
  • verifier — l'outil d'assertion, historiquement pluggable (Testinfra, Chef InSpec,
 Goss), aujourd'hui recentré sur pytest/Testinfra dans les versions récentes de Molecule
 (détails précis selon version, à vérifier).
# molecule/default/molecule.yml
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance-debian
    image: debian:12
  - name: instance-rocky
    image: rockylinux:9
provisioner:
  name: ansible
verifier:
  name: testinfra

Un rôle peut posséder plusieurs scénarios (ex. default, upgrade, multi-node) pour couvrir des cas d'usage différents ; on les crée avec molecule init scenario.

Cycle de vie d'un test

dependency  -> installe les dépendances (rôles/collections Galaxy)
lint        -> analyse statique (yamllint, ansible-lint)
syntax      -> vérifie la syntaxe du playbook de test
create      -> provisionne la cible via le driver
prepare     -> prépare la cible avant le rôle testé (pré-requis)
converge    -> exécute le rôle testé sur la cible (le cœur du test)
idempotence -> ré-exécute le rôle : aucun changement ne doit être signalé
verify      -> lance les assertions (Testinfra/pytest)
destroy     -> détruit la cible de test

molecule test enchaîne toutes ces étapes (utilisé en CI) ; molecule converge seul est pratique en développement itératif, pour ne pas recréer la cible à chaque essai.

Drivers : Docker vs Vagrant vs delegated

Driver Nature de la cible Avantage Limite
Docker Conteneur Rapide, léger, par défaut Pas de vrai noyau/systemd complet selon l'image (mitigé par des images « init »)
Vagrant Machine virtuelle complète Fidélité proche de la prod (kernel, systemd, réseau) Plus lourd et plus lent que Docker
Delegated Cible fournie par l'utilisateur (VM cloud existante, hôte physique) Teste sur une cible réaliste déjà provisionnée Pas de création/destruction automatique

Le choix Docker par défaut privilégie la vitesse d'itération ; Vagrant reste pertinent quand le rôle testé dépend fortement de comportements bas niveau (modules kernel, montage disque, systemd units) mal simulés en conteneur.

Vérification : Testinfra / pytest

Testinfra permet d'écrire les assertions en pytest, avec une API orientée état système :

# molecule/default/tests/test_default.py
import pytest

def test_service_nginx(host):
    svc = host.service("nginx")
    assert svc.is_running
    assert svc.is_enabled

def test_config_file(host):
    f = host.file("/etc/nginx/nginx.conf")
    assert f.exists
    assert f.user == "root"
    assert f.mode == 0o644

def test_port_listening(host):
    assert host.socket("tcp://0.0.0.0:80").is_listening

Ces tests s'exécutent contre la cible réellement provisionnée (via le backend de connexion approprié : docker exec, SSH...), donc les assertions portent sur l'état système effectif, pas sur une simulation.

Intégration continue

Molecule est conçu pour tourner en CI (GitLab CI, GitHub Actions...) : chaque rôle/collection embarque ses scénarios, et le pipeline exécute molecule test à chaque modification, sur plusieurs plateformes (matrice de platforms) en parallèle.

Voir aussi