Passer au contenu principal

Expertise (Ansible)

Molecule : tests avancés

Molecule à niveau basique teste un rôle dans un conteneur Docker. À niveau avancé, il teste sur plusieurs distributions simultanément, vérifie l'état réel avec Testinfra, et valide chaque commit en CI.

molecule.yml multi-plateformes

driver:
  name: docker

platforms:
  - name: debian13
    image: geerlingguy/docker-debian13-ansible
    pre_build_image: true
  - name: ubuntu2204
    image: geerlingguy/docker-ubuntu2204-ansible
    pre_build_image: true
  - name: rockylinux9
    image: geerlingguy/docker-rockylinux9-ansible
    pre_build_image: true

verifier:
  name: testinfra

Testinfra : vérifier l'état réel

# molecule/default/tests/test_nginx.py
def test_nginx_installed(host):
    assert host.package("nginx").is_installed

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

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

def test_config_valid(host):
    assert host.run("nginx -t").rc == 0

Cycle de test

molecule test           # cycle complet
molecule converge       # appliquer le rôle
molecule verify         # lancer les tests
molecule idempotence    # vérifier changed=0 au 2e run
molecule login          # SSH dans l'instance pour debug

GitHub Actions

name: Molecule
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: {python-version: "3.11"}
      - run: pip install ansible molecule molecule-plugins[docker] testinfra pytest
      - run: molecule test
        working-directory: roles/nginx

GitLab CI

molecule:
  stage: test
  image: python:3.11
  services: [docker:dind]
  variables:
    DOCKER_HOST: tcp://docker:2376
  script:
    - pip install ansible molecule molecule-plugins[docker] testinfra
    - cd roles/nginx && molecule test
  only:
    changes: [roles/nginx/**]