Aller au contenu
Infrastructure as Code medium

Tests tox multi-versions : valider un rôle sur ansible-core 2.16, 2.17, 2.18

6 min de lecture

Logo Ansible

Un rôle publié doit fonctionner sur plusieurs versions d'ansible-core (votre utilisateur peut être en 2.16, vous développez en 2.18). tox automatise les tests sur la matrice de versions : tox lance molecule test dans un environnement Python isolé pour chaque version d'Ansible.

Cette page utilise un tox.ini classique (sans le plugin tox-ansible), pattern stable, lisible, et utilisé sur les rôles de production.

  • Écrire un tox.ini classique pour rôle Ansible.
  • Définir une matrice de versions ansible-core (envlist = ansible-2.{16,17,18}).
  • Configurer Python par version d'Ansible.
  • Ajouter un env lint séparé pour fail-fast.
  • Lancer tox complet ou un environnement ciblé.
  • tox installé : pipx install tox.
  • Molecule + Podman opérationnels.
  • Avoir un rôle avec un scénario Molecule fonctionnel.
; tox.ini — pattern classique multi-versions ansible-core
[tox]
envlist = ansible-2.{16,17,18}
skipsdist = true
[testenv]
commands = molecule test
setenv =
TOX_ENVNAME={envname}
PY_COLORS=1
ANSIBLE_FORCE_COLOR=1
ANSIBLE_ROLES_PATH=../
passenv = *
[testenv:ansible-2.16]
basepython = python3.10
deps =
ansible-core==2.16.*
ansible-lint==24.*
molecule>=25.0
molecule-plugins[podman]>=25.0
requests
pytest
[testenv:ansible-2.17]
basepython = python3.10
deps =
ansible-core==2.17.*
ansible-lint==24.*
molecule>=25.0
molecule-plugins[podman]>=25.0
requests
pytest
[testenv:ansible-2.18]
basepython = python3.12
deps =
ansible-core==2.18.*
ansible-lint==25.*
molecule>=26.0
molecule-plugins[podman]>=25.0
requests
pytest
; Lint séparé — fail-fast (s'exécute en premier, isolé)
[testenv:lint]
basepython = python3.12
deps =
ansible-lint==25.*
yamllint
commands =
yamllint roles/
ansible-lint --profile=production roles/
envlist = ansible-2.{16,17,18}
skipsdist = true
  • envlist = matrice. La syntaxe 2.{16,17,18} génère 3 environnements : ansible-2.16, ansible-2.17, ansible-2.18.
  • skipsdist = true = pas de package Python à distribuer (un rôle n'a pas de setup.py).
commands = molecule test
setenv =
ANSIBLE_ROLES_PATH=../
passenv = *
  • commands : ce qui s'exécute (molecule test pour le cycle complet).
  • setenv : variables d'env exposées à Ansible.
  • passenv = * : laisse passer toutes les variables d'env (utile pour tokens, etc.).
basepython = python3.10
deps =
ansible-core==2.16.*
molecule>=25.0
  • basepython : version Python compatible avec ansible-core ciblée. Ansible 2.16 exige Python 3.10+, Ansible 2.18 exige 3.12+.
  • deps : pinning des versions exactes.
Fenêtre de terminal
tox

Tox crée 3 environnements virtuels Python, installe les deps, lance molecule test dans chacun.

Fenêtre de terminal
tox -e ansible-2.18

Cible une version spécifique, utile en dev.

Fenêtre de terminal
tox -e lint

Lance ansible-lint --profile=production + yamllint. À mettre en premier dans une CI (s'il échoue, pas la peine de lancer Molecule).

Fenêtre de terminal
# Étape 1 : lint (rapide)
tox -e lint
# Étape 2 : matrice complète
tox
# Étape 3 (sur tag Git) : publication Galaxy
tox -e publish
OutilPérimètreRecommandation 2026
tox classiqueRôles standalone✅ Recommandé
tox-ansibleCollections AnsibleQuand vous publiez une collection
noxAlternative Python à toxUtilisable mais moins courant en Ansible
GitHub Actions matrixCI/CD natifComplémentaire (voir page CI)

Cette page a un lab d'accompagnement : labs/tests/tox-multiversion/ dans stephrobert/ansible-training.

Le lab fournit un tox.ini complet avec 3 envs ansible-core + 1 env lint. 6 tests structure validés (envlist, deps, lint env).

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/tests/tox-multiversion/
cat tox.ini
tox -e lint # lint rapide
pytest -v challenge/tests/ # tests structure

Pour lancer la matrice complète (long, 5-10 min/env) :

Fenêtre de terminal
tox
SymptômeCauseFix
Python 3.10 not foundbasepython absent du systèmeInstaller Python 3.10 ou utiliser pyenv
ansible-core 2.16 incompatible avec Python 3.13Trop récentUtiliser Python 3.10 pour Ansible 2.16/2.17
Lent à chaque runtox recrée les venvUtiliser tox -r (recreate) seulement si deps changent
Tests passent locallement mais ratent en CIVariables d'env manquantesAjouter passenv = * ou lister les vars critiques
molecule test lent en localContainer recreate à chaque envCycle dev : molecule converge puis molecule verify
  • tox.ini classique > tox-ansible pour rôles standalone.
  • envlist = ansible-2.{16,17,18} = matrice de versions.
  • basepython par version d'Ansible (2.16 → 3.10, 2.18 → 3.12).
  • Env lint séparé pour fail-fast en CI.
  • tox -e <env> pour cibler une version en dev.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn