Aller au contenu
Infrastructure as Code medium

Execution Environments Ansible : ansible-navigator, ansible-builder, EE custom

10 min de lecture

Logo Ansible

Un Execution Environment (EE) est une image conteneur OCI qui empaquette tout ce dont Ansible a besoin pour tourner : ansible-core, ansible-runner, des collections Galaxy, des dépendances Python et des packages système. Le même runtime tourne du laptop de dev au controller AAP, en CI, sur AWX self-hosted. C'est la fin du « ça marche sur mon poste » et la base de la reproductibilité Ansible 2026. Cette section couvre l'adoption pro des EE : ansible-navigator pour exécuter, ansible-builder pour construire, scan/signature/CI durcie pour publier. Incontournable sur AAP 2.6 et régulièrement à l'examen RHCE EX294.

  • Comprendre ce qu'est un EE OCI et pourquoi il remplace progressivement le venv local.
  • Installer Podman + ansible-navigator + ansible-builder sur AlmaLinux 10.
  • Exécuter un playbook dans un EE avec ansible-navigator run (TUI vs stdout).
  • Inspecter les collections, ansible-core, Python deps d'un EE existant.
  • Construire un EE custom avec execution-environment.yml v3.
  • Sécuriser la chaîne : pinning, scan Trivy, signature cosign.

Avant cette section, vous devez avoir validé :


Mon retour d'expérience, pour ceux qui veulent comprendre

Section intitulée « Mon retour d'expérience, pour ceux qui veulent comprendre »

Si l'une des cartes en haut de page vous a déjà orienté, vous êtes parti sur le bon pied. La suite de cette page s'adresse à ceux qui veulent comprendre la philosophie de cette section : pourquoi je pousse à basculer vers les EE même hors AAP, pourquoi ansible-playbook reste valable en dev, et pourquoi je refuse les images sans signature en prod.

J'ai accompagné plusieurs équipes dans leur passage venv local → EE OCI entre 2022 et 2025. Le verdict : les équipes qui résistent au changement « parce que ansible-playbook suffit » se retrouvent en panique le jour où elles découvrent que leur AAP refuse leur playbook. L'EE n'est pas un sur-équipement, c'est l'unité de déploiement standard d'Ansible 2026, comme Docker l'est pour les apps. Cette section compile ce que j'ai appris à ne jamais relâcher dans un EE qui part en prod.

Trois constats motivent le passage aux EE :

  • Drift de versions : un dev avec ansible-core 2.17.5 + community.general 9.0.0, un autre avec 2.18.1 + 10.5.0, le CI avec encore une autre combinaison. Modules dépréciés, comportements subtilement différents → bugs en prod.
  • Onboarding fragile : nouveau collègue installe Ansible avec sa version distro, ne match pas ce qui tourne sur AWX → playbook KO chez lui.
  • AAP impose les EE : Automation Controller 2.5/2.6 exécute uniquement dans des EE. Pas d'autre choix en prod entreprise.

Un EE résout ces 3 points : image OCI immuable versionnée, pinned strictement, distribuée par registre OCI (Quay, Harbor, GHCR). Le runtime est figé bit-pour-bit.

OutilRôleQuand l'utiliser
ansible-playbookExécuteur classique (venv local)Itération rapide en dev, scripts ponctuels
ansible-navigatorExécuteur dans un EEProduction, CI/CD, formation, AAP
ansible-builderConstructeur d'EECréer / mettre à jour son EE custom
podmanRuntime conteneurSous-jacent aux 3 ci-dessus

Vous resterez sur ansible-playbook côté dev pour itérer rapidement sur un nouveau playbook (~0.5 s vs ~3 s avec navigator). Dès que vous shippez (CI, prod, formation), vous bascule sur ansible-navigator + EE.

ImageTailleUsage
quay.io/ansible/creator-ee~1.2 GBFormation, dev. Riche : ansible-lint, navigator deps, nombreuses collections.
quay.io/ansible/awx-ee~900 MBAWX upstream self-hosted.
quay.io/ansible/community-ee-minimal~400 MBBase minimale pour custom EE.
registry.redhat.io/.../ee-supported-rhel9~1 GBProduction AAP avec collections certifiées Red Hat (Subscription).

Décision pratique : formation et lab → creator-ee. Production sans contrat Red Hat → custom EE basé sur community-ee-minimal. Production AAP entreprise → ee-supported-rhel9 ou custom basé dessus.

Cinq positions tranchées que cette section assume :

  • version: 3 dans execution-environment.yml. Le format v1 ignore silencieusement les sections de deps. Bug le plus fréquent en formation. Si vous écrivez un EE en 2026, c'est v3, point.
  • Pinning strict de bout en bout. ansible-core en version exacte (pas >=), collections par tag (pas branche), Python deps en requirements.txt figé, packages système par version dans bindep.txt. Le coût d'un drift en prod est mille fois supérieur au confort d'écrire :latest.
  • Smoke test post-build mandatory. podman run --rm $TAG ansible --version après chaque build. Un EE peut builder « OK » et ne contenir aucun ansible-core (cas du version: 3 manquant). Vérifier en 2 secondes vaut mieux que découvrir le bug en prod.
  • Trivy scan + cosign sign en CI. Pas optionnel. Une CVE critique non patchée dans un EE = root sur tout votre parc. La chaîne build → scan → sign → push est l'équivalent OCI de ansible-test sanity : non négociable.
  • ansible-playbook reste valable en dev local. Itération rapide (~0.5 s vs 3 s navigator). Bascule sur navigator dès qu'on shippe (CI, prod, formation). Pas de dogme, chaque outil sur son créneau.

Cinq erreurs typiques sur les EE, chacune coûteuse à diagnostiquer :

  • :latest sur l'image de base ou les collections. Reproductibilité cassée, drift garanti à chaque build. Pinning strict ou vous n'avez pas un EE, vous avez une image flottante qui marche aujourd'hui et plante demain.
  • version: 3 oublié dans execution-environment.yml. ansible-builder lit en mode v1, ignore les sections de deps. Le build « réussit » mais l'EE est vide. Smoke test post-build le détecte immédiatement.
  • Volumes Podman sans :Z sur SELinux activé. Permission denied qui ressemble à un bug Ansible alors que c'est SELinux qui bloque. :Z sur tout bind mount sur RHEL/AlmaLinux.
  • Python interpreter mismatch. L'EE embarque Python 3.11, la cible AlmaLinux 8 a 3.6, modules avec deps natives plantent. ansible_python_interpreter dans l'inventaire pour pointer vers le bon Python sur la cible.
  • Push d'EE non signé sur registre public. Sans cosign, pas de garantie d'intégrité. Un attaquant qui prend le contrôle du registre peut substituer votre image. cosign sign --keyless en CI = SBOM + signature, gratuit et vérifié.

Le parcours est séquentiel. Chaque phase suppose acquise la précédente.

Le minimum vital : qu'est-ce qu'un EE, comment lancer un playbook avec ansible-navigator.

Avant de builder son propre EE, savoir quels EE existent et ce qu'ils contiennent.

Le cœur du sujet : execution-environment.yml v3, ansible-builder, pinning rigoureux.

Build automatisé, scan, signature, push. Pour la production.

┌────────────────────┐
│ execution- │
│ environment.yml │
│ + requirements │ ──▶ ansible-builder build ──▶ Image OCI custom
│ + bindep.txt │
└────────────────────┘
Trivy scan + cosign sign ──▶ Push registre privé (Quay, GHCR)
ansible-navigator run / AAP Controller / CI ──▶ Exécution sur cibles

Bénéfice clé : à n'importe quel moment, n'importe qui peut rejouer le même runtime en pull-ant l'image taggée :1.4.2. Aucun "pip install" surprise, aucune collection Galaxy qui change sous les pieds.

  • Un EE est une image OCI qui empaquette ansible-core + collections + deps Python + system.
  • ansible-navigator lance un playbook dans un EE (TUI ou stdout) ; ansible-builder construit l'EE.
  • version: 3 obligatoire dans execution-environment.yml en 2026.
  • Pinning strict sur toutes les couches (ansible-core, collections, Python, system).
  • creator-ee pour la formation/dev, community-ee-minimal comme base custom, ee-supported-rhel9 pour AAP enterprise.
  • CI 2026 : build → Trivy → push → cosign keyless. Actions GitHub pinnées par SHA, permissions: {}, persist-credentials: false.

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