
Un EE peut "build OK" et pourtant être inutilisable. Le piège le plus fréquent en 2026 : oublier version: 3 dans execution-environment.yml, ansible-builder lit alors en mode v1 hérité, ignore silencieusement les sections de dépendances modernes, et produit une image qui n'a même pas ansible-core installé. Aucune erreur visible. Cette page liste les 4 bugs les plus fréquents avec leur diagnostic et leur fix.
À la fin, vous saurez détecter immédiatement un EE défectueux par smoke test, identifier la cause racine via les logs ansible-builder --verbosity 2, et conserver les modules Ansible exécutés sur la cible (ANSIBLE_KEEP_REMOTE_FILES=1) pour debug forensic.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Diagnostiquer un EE qui build "OK" mais ne contient pas
ansible-core. - Reconnaître une collection Galaxy inexistante dans les logs.
- Détecter une version Python pinnée inexistante sur PyPI.
- Conserver les modules Ansible exécutés (
ANSIBLE_KEEP_REMOTE_FILES). - Smoke test post-build systématique en CI.
Prérequis
Section intitulée « Prérequis »- Avoir lu Construire un EE custom.
ansible-builder ≥ 3.1.0et Podman installés.
Diagnostic rapide, 4 symptômes, 4 causes
Section intitulée « Diagnostic rapide, 4 symptômes, 4 causes »| Symptôme | Cause probable | Fix |
|---|---|---|
build OK mais podman run --rm <ee> ansible --version → command not found | version: 3 oublié | Ajouter version: 3 en première ligne |
Build échoue : community.does-not-exist:1.2.3 was NOT installed successfully | Collection Galaxy inexistante ou version invalide | Vérifier sur galaxy.ansible.com |
Build échoue : Could not find a version that satisfies the requirement <pkg>==<ver> | Version Python inexistante sur PyPI | Vérifier sur pypi.org |
MODULE FAILURE à l'exécution avec python: command not found | Mauvais python_interpreter côté cible | Pinner ansible_python_interpreter dans inventory |
Bug 1, version: 3 oublié (le piège n°1)
Section intitulée « Bug 1, version: 3 oublié (le piège n°1) »Symptôme : ansible-builder build retourne Successfully tagged ... sans erreur. Mais l'EE est vide :
podman run --rm local/my-ee:dev ansible --version# /bin/sh: ansible: command not foundDiagnostic : remonter aux logs avec --verbosity 2 :
ansible-builder build \ --tag local/my-ee:dev \ --container-runtime podman \ --file execution-environment.yml \ --context ./context \ --verbosity 2 2>&1 | head -20Vous voyez :
WARNING: No 'version' key found, defaulting to schema v1[1/2] Building image...Cause : sans version: 3, ansible-builder utilise le schéma v1 hérité. Les sections dependencies.ansible_core, dependencies.python, dependencies.system modernes sont silencieusement ignorées. L'image est buildée à partir de la base sans ajouter ansible-core.
Fix : ajouter version: 3 en première ligne :
---version: 3 # ← OBLIGATOIRE en 2026
images: base_image: name: ghcr.io/ansible-community/community-ee-minimal:latest
dependencies: ansible_core: package_pip: ansible-core==2.18.1 ansible_runner: package_pip: ansible-runner==2.4.1 galaxy: requirements.yml python: requirements.txt system: bindep.txtBug 2, Collection Galaxy inexistante
Section intitulée « Bug 2, Collection Galaxy inexistante »Symptôme :
[1/3] Galaxy stage: ERROR! - community.does-not-exist:1.2.3 was NOT installed successfully: could not find versions that match: 1.2.3 for: community.does-not-existDiagnostic : le nom de la collection ou sa version n'existe pas sur Galaxy.
ansible-galaxy collection list community.does-not-exist 2>&1# ou via le navigateur :# https://galaxy.ansible.com/ui/repo/published/community/does-not-exist/Causes fréquentes :
- Typo dans le nom :
comunity.generalau lieu decommunity.general. - Version retirée : la collection a été dépréciée et la version 1.2.3 n'est plus distribuée.
- Collection privée : nom valide mais hébergée sur Automation Hub (pas Galaxy), il faut configurer
ANSIBLE_GALAXY_SERVER_LIST.
Fix : remplacer par une collection valide :
collections: - name: ansible.posix version: 2.0.0 - name: kubernetes.core # ← collection valide version: 5.1.1Bug 3, Version Python inexistante sur PyPI
Section intitulée « Bug 3, Version Python inexistante sur PyPI »Symptôme :
[2/3] Python deps: ERROR: Could not find a version that satisfies the requirement kubernetes==9999.0.0 ERROR: No matching distribution found for kubernetes==9999.0.0Diagnostic : la version pinnée n'existe pas sur PyPI.
pip index versions kubernetes 2>&1 | head -5# ou via le navigateur :# https://pypi.org/project/kubernetes/Causes fréquentes :
- Typo :
31.0.O(lettre O) au lieu de31.0.0(chiffre 0). - Version trop récente non encore publiée.
- Version retirée par l'éditeur (rare mais arrive).
- Proxy d'entreprise qui filtre PyPI.
Fix : pinner une version réelle :
kubernetes==31.0.0PyYAML==6.0.2jsonpatch==1.33Bug 4, Python interpreter mismatch côté cible
Section intitulée « Bug 4, Python interpreter mismatch côté cible »Symptôme : l'EE est OK mais à l'exécution :
fatal: [target]: FAILED! => {"module_stderr": "...python3: command not found", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}Diagnostic : l'EE embarque python3.11, mais la cible (par exemple AlmaLinux 8) n'a que python3.6. Le module Ansible transféré par l'EE essaie de lancer python3.11 qui n'existe pas sur la cible.
Investigation forensique : conserver le module sur la cible :
ANSIBLE_KEEP_REMOTE_FILES=1 ansible-navigator run site.yml -vvv -m stdoutSur la cible, le module est dans ~ansible/.ansible/tmp/ansible-tmp-*/AnsiballZ_<module>.py. Inspecter :
ssh ansible@targetcd ~/.ansible/tmp/ansible-tmp-*/head -1 AnsiballZ_copy.py# → #!/usr/bin/python3.11 (or whatever interpreter the EE expected)Fix : pinner explicitement l'interpréteur dans l'inventaire selon la cible :
[webservers:vars]ansible_python_interpreter=/usr/bin/python3Ou dans execution-environment.yml, choisir une base alignée avec les cibles :
images: base_image: name: ghcr.io/ansible-community/community-ee-minimal:latest # UBI 9, Python 3.11
# Si cibles AlmaLinux 8 (Python 3.6) → choisir une base UBI 8 plutôtWorkflow de debug systématique
Section intitulée « Workflow de debug systématique »-
Smoke test post-build :
Fenêtre de terminal podman run --rm $TAG ansible --version | head -1Si vide → bug
version: 3. Si OK, passer à 2. -
Inspecter les collections :
Fenêtre de terminal podman run --rm $TAG ansible-galaxy collection list 2>&1 | head -20Si une collection attendue manque → bug requirements.yml.
-
Inspecter les Python deps :
Fenêtre de terminal podman run --rm $TAG pip list 2>&1 | head -30Si une lib attendue manque → bug requirements.txt.
-
Tester sur cible avec
ANSIBLE_KEEP_REMOTE_FILES=1:Fenêtre de terminal ANSIBLE_KEEP_REMOTE_FILES=1 ansible-navigator run site.yml -vvv -m stdoutSi
MODULE FAILURE→ inspecter~/.ansible/tmp/...sur la cible. -
Inspecter le Containerfile généré :
Fenêtre de terminal cat ./context/ContainerfileVérifier les 4 stages (
base,galaxy,builder,final).
Mettre en pratique
Section intitulée « Mettre en pratique »Le workflow de diagnostic se retient d'autant mieux qu'on l'applique à des pannes qu'on n'a pas écrites soi-même. Le lab fournit un execution-environment-buggy.yml porteur de trois défauts volontaires : la version de schéma oubliée, une collection Galaxy qui n'existe pas, et une version PyPI introuvable. À vous de les isoler dans l'ordre, de corriger, puis de prouver par un smoke test que l'environnement reconstruit contient bien ce qu'il annonce.
Sécurité, bonnes pratiques 2026
Section intitulée « Sécurité, bonnes pratiques 2026 »version: 3mandatory en première ligne, jamais oublié.- Smoke test post-build dans la CI :
podman run --rm $TAG ansible --version. --verbosity 2minimum en CI pour capter les warnings comme « schema v1 default ».- Pinning par digest SHA-256 sur la base image en production :
community-ee-minimal@sha256:abc.... - Renovate / Dependabot pour bumper les pinning automatiquement (PR-driven).
hadolintsur leContainerfilegénéré pour détecter les anti-patterns.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Un EE peut "build OK" sans contenir ansible-core, le smoke test post-build est obligatoire.
version: 3oublié → schéma v1 hérité utilisé silencieusement, 95 % des cas de debug.- Collection Galaxy inexistante → vérifier sur galaxy.ansible.com avec le nom + version.
- Version PyPI inexistante → vérifier sur pypi.org.
ANSIBLE_KEEP_REMOTE_FILES=1pour conserver les modules sur la cible et debug forensic.- Renovate pour ne jamais rater une mise à jour de sécurité sur les pinning.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Verbosité (-v à -vvvv) : Choisir le niveau de verbosité selon le symptôme, plutôt que de lancer -vvvv par réflexe.
- Débogueur interactif : Inspecter les variables d'une tâche au moment où elle échoue, sans relancer tout le playbook.
- Idempotence et tuning : Le versant performance : pipelining, forks et ControlPersist une fois l'exécution stabilisée.