Aller au contenu
Infrastructure as Code medium

Qu'est-ce qu'un Execution Environment Ansible : définition, contenu, format OCI

8 min de lecture

Logo Ansible

Un Execution Environment (EE) est une image conteneur OCI qui empaquette tout ce dont Ansible a besoin pour s’exécuter : ansible-core, ansible-runner, des collections Galaxy, des dépendances Python et des packages système (git, sshpass, openssh-clients). Cette page définit précisément le concept, son contenu, et le compare avec les approches précédentes (venv local, image Docker générique).

À la fin, vous saurez exactement ce qui vit dans un EE, ce qui n’y vit pas, et pourquoi Red Hat l’a imposé sur Ansible Automation Platform 2.x dès 2021.

  • Définition exacte d’un EE (vs Docker image générique).
  • Contenu type : ansible-core, ansible-runner, collections, deps Python, deps système.
  • Format OCI : compatible Podman, Docker, Skopeo, Buildah.
  • Différence avec un venv local : reproductibilité, isolation, portabilité.
  • Place dans AAP : Automation Controller, AWX, Tower.
  • Bases Podman (podman --version, podman run, podman images).
  • Notion de collection Ansible et FQCN.

Un Execution Environment est une image conteneur au format OCI (Open Container Initiative). Le format OCI normalise la structure d’une image entre runtime — Podman, Docker, containerd, CRI-O sont tous compatibles. Une image OCI publiée sur Quay, Docker Hub, GitHub Container Registry ou Harbor est lisible par tous ces outils sans conversion.

L’EE est introduit avec Ansible Automation Platform 2.0 (octobre 2021) pour résoudre un problème opérationnel : sur Tower 1.x, le serveur Ansible exécutait directement les playbooks dans son propre venv, source de drift et de conflits. AAP 2.x déplace l’exécution dans un conteneur isolé, avec un runtime figé.

Sur AAP 2.6 (sortie 2026), l’EE est le seul mode d’exécution disponible — pas de fallback “venv local”. Maîtriser les EE est donc devenu non négociable pour quiconque touche à AAP en production.

Un EE typique embarque 6 couches logicielles :

CoucheRôleExemple 2026
Image de base OCIOS minimalUBI 9 (Universal Base Image Red Hat)
Python interpreterRuntime PythonPython 3.11 ou 3.12
ansible-coreLe moteur Ansible2.18.x
ansible-runnerAPI programmatique pour lancer Ansible2.4.x
Collections Galaxyansible.posix, community.general, etc.Pinnées en versions exactes
Deps PythonModules requis par certaines collectionskubernetes, pywinrm, boto3
Deps systèmeOutils CLI nécessairesgit, openssh-clients, sshpass

Tout est figé au moment du build. Une fois l’image taguée (my-ee:1.4.2), rien ne change — c’est le contraire d’un venv qui peut subir un pip install --upgrade à tout moment.

Une image OCI est une série de couches (layers) + un manifest + une config. Conséquences concrètes :

  • Reproductible : un manifest référence les layers par digest SHA-256. pull la même image deux fois produit le même contenu, bit-pour-bit.
  • Distribuable : push sur n’importe quel registre OCI (Quay, GHCR, Harbor, Artifactory, ECR, GCR).
  • Inspectable : podman inspect, skopeo inspect, crane manifest listent les layers, l’image base, les commandes lancées.
  • Signable : cosign sign ajoute une attestation Sigstore liée au digest. cosign verify la valide avant exécution.

C’est le standard de l’industrie depuis 2017 — adopté par Kubernetes, Docker, OpenShift, AKS, EKS. Les EE héritent de toute cette infrastructure mature.

CritèreVenv localEE OCI
Créationpython -m venv ; pip install ansiblepodman pull quay.io/...
ReproductibilitéSelon l’état du PyPI au moment du pip installBit-pour-bit identique partout
PortabilitéRecréer le venv sur chaque postePull la même image
Versioningpip freeze > requirements.txt (fragile)Tag image semver
Onboarding« Suivez ces 5 commandes »« podman pull »
DémarrageImmédiat+1-3 s (lancement conteneur)
Dev iteratifExcellent (recharge rapide)Moins fluide
Prod / CIDrift garanti à termeStable

Décision pratique : venv local pour itérer en dev sur un nouveau playbook. EE pour shipper.

Un EE n’est pas une simple image Docker contenant Ansible. Il a des conventions précises :

  • Layout /runner/ attendu par ansible-runner (inventory, project, env).
  • /etc/ansible/ configurable via additional_build_steps.
  • Métadonnées d’image spécifiques (label ansible.com/runner etc.).
  • ENTRYPOINT optimisé pour ansible-runner (pas un shell générique).

Un Dockerfile artisanal qui installe ansible-core marchera techniquement, mais ne sera pas optimal avec ansible-navigator ni AAP. Toujours partir des base images officielles (creator-ee, community-ee-minimal, ee-supported-rhel9).

Sur AAP, on retrouve les EE dans Automation Controller :

  • Onglet “Execution Environments” : registre des EE disponibles.
  • Project : dépôt Git des playbooks.
  • Job Template : playbook + inventaire + EE associé. Le job tourne dans cet EE.
  • Credentials : crédentials Vault, Cloud, Git — montés dans l’EE au runtime.

Pareil sur AWX upstream (l’open-source en amont d’AAP) : même UI, mêmes concepts, image AWX-EE par défaut (quay.io/ansible/awx-ee).

Cas concret — pourquoi c’est mieux qu’un venv

Section intitulée « Cas concret — pourquoi c’est mieux qu’un venv »

Scénario : équipe DevOps de 5 personnes, projet Ansible avec 30 playbooks, déploiement sur 200 serveurs.

Avec venv local :

  • Anna installe Ansible 2.17.5 via dnf (paquet distro AlmaLinux).
  • Bruno installe 2.18.1 via pipx.
  • Le runner GitLab CI utilise une image avec 2.16.x (vieille).
  • Trois mois plus tard, un module ansible.builtin.dnf se comporte légèrement différemment entre 2.16 et 2.18 → un playbook qui marche en CI plante chez Anna.
  • Debug : 4 heures pour aligner les versions, retests, redéploiement.

Avec EE :

  • Tous (dev + CI + AAP) tirent acme/my-ee:1.4.2.
  • Identique partout. Si quelque chose change, c’est par un commit explicite sur execution-environment.yml.
  • Bump de version : un seul tag à pousser, tout le monde repulled la nouvelle version.

C’est exactement le bénéfice apporté par Docker sur les apps web depuis 2014 — appliqué à Ansible.

Le lab ee/hello du repo ansible-training fait passer du concept à la pratique : install Podman + ansible-navigator, pull creator-ee, lance un premier playbook en TUI puis en stdout. 6 tests pytest valident la structure du lab.

Suivre : labs/ee/hello/README.md.

  • Un EE = image OCI qui empaquette ansible-core + ansible-runner + collections + deps Python + deps système.
  • Format standard : compatible Podman, Docker, AAP, AWX, CI/CD.
  • Reproductibilité : tag immuable, identique partout, pas de drift.
  • Imposé sur AAP 2.6 : seul mode d’exécution disponible côté Controller.
  • Dev : venv local reste plus rapide. Ship : EE obligatoire.
  • 6 couches : OS base + Python + ansible-core + ansible-runner + collections + deps.

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