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 tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn