ℹ️ À savoir · En bref

Lancer ansible-playbook depuis son poste ne passe pas à l'échelle : pas de traçabilité, secrets dispersés, droits flous. AWX (projet open source) et Ansible Automation Platform (offre Red Hat, dont le cœur est l'*automation controller*, ex-Tower) centralisent l'exécution : interface web, API, droits, journal de chaque exécution.

Les playbooks restent dans Git ; la plateforme les exécute dans des environnements d'exécution (conteneurs) reproductibles.

Objectifs de la fiche

  • Comprendre les objets d'AWX / AAP et comment ils s'assemblent.
  • Construire un environnement d'exécution avec ses collections.
  • Exposer un playbook en libre-service (survey) avec les bons droits.
  • Brancher Ansible dans une chaîne CI/CD.

AWX ou Ansible Automation Platform ?

AWXAnsible Automation Platform
NatureProjet communautaire, amont (upstream)Produit Red Hat supporté
InstallationAWX Operator sur KubernetesInstalleur conteneurisé, RPM ou OpenShift
Cycle de vieVersions fréquentes, pas de supportVersions stabilisées, support, certifications
Composants en plus—Private Automation Hub, Event-Driven Ansible, automation mesh, collections certifiées
Pour quiLab, PME, apprentissageProduction en entreprise

Les objets et leur assemblage

Un modèle de tâche assemble projet, inventaire, identifiants et environnement d'exécution
Un modèle de tâche assemble projet, inventaire, identifiants et environnement d'exécution
ObjetRôle
Organisation / équipesCloisonnement et droits : qui voit, modifie ou lance quoi
ProjetPointe vers un dépôt Git (branche ou tag) ; synchronisé avant exécution
InventaireStatique, issu d'un fichier du projet, ou dynamique (Azure, vCenter, AD…) rafraîchi automatiquement
Identifiants (credentials)Comptes machine, Vault, cloud, Git : chiffrés en base, injectés au lancement, jamais affichés
Environnement d'exécution (EE)Image conteneur avec ansible-core, Python et les collections nécessaires
Modèle de tâche (job template)Playbook + inventaire + identifiants + EE + options (limit, tags, verbosité, survey)
WorkflowEnchaînement de modèles avec branches succès / échec et étapes d'approbation
Planification / webhookLancement à heure fixe, ou à chaque push Git

Environnements d’exécution

Fini le « ça marche sur mon poste » : on décrit l'image, ansible-builder la construit, et la même image sert en local (ansible-navigator) et dans AWX.

execution-environment.yml

# execution-environment.yml
version: 3
images:
  base_image:
    name: quay.io/ansible/awx-ee:latest      # ou une image de base Red Hat
dependencies:
  galaxy: requirements.yml                    # ansible.windows, microsoft.ad, contoso.citrix…
  python: requirements.txt                    # pywinrm[kerberos], pypsrp…
  system: bindep.txt                          # krb5-devel, gcc…
additional_build_steps:
  append_final:
    - COPY krb5.conf /etc/krb5.conf

commandes

ansible-builder build -t registry.contoso.com/ee-citrix:1.0     # construire l'image
podman push registry.contoso.com/ee-citrix:1.0                   # la publier
ansible-navigator run site.yml --eei registry.contoso.com/ee-citrix:1.0 -i inventory
                                                               # exécuter en local dans le même EE

💡 Astuce

Pour Windows en Kerberos, l'EE doit contenir pywinrm[kerberos] (ou pypsrp) et la configuration Kerberos du domaine : c'est la cause n°1 des échecs « ça marchait en ligne de commande » (voir ANS-03).

Libre-service : surveys et droits

  • Un survey affiche un petit formulaire au lancement (liste de choix, texte, nombre) et transmet les réponses comme extra_vars.
  • Exemple : un modèle « Ajouter des VDA au catalogue » demande le catalogue et le nombre de machines, puis lance le playbook ou le Terraform correspondant.
  • Les droits (RBAC) séparent qui modifie un modèle (admin) de qui peut seulement l'exécuter (support N1).
  • Les identifiants sont utilisables sans être visibles : le support lance la tâche sans jamais connaître le mot de passe du compte de service.

Déclencher depuis l’extérieur

déclenchement

# CLI awx (paquet awxkit) — même logique pour l'API REST
export CONTROLLER_HOST=https://awx.contoso.com
export CONTROLLER_OAUTH_TOKEN=<jeton>           # depuis le coffre du pipeline
awx job_templates launch "Construire image VDA" \
    --extra_vars '{"vda_version": "2507"}' --monitor

# Ou en Ansible, avec la collection awx.awx (ou ansible.controller pour AAP)
- name: Lancer la construction d'image
  awx.awx.job_launch:
    job_template: "Construire image VDA"
    extra_vars: { vda_version: "2507" }
    wait: true

ℹ️ À savoir

La configuration d'AWX elle-même (projets, modèles, droits) peut être décrite en code avec la collection awx.awx / ansible.controller : on versionne la plateforme comme le reste.

Le pipeline CI/CD

Contrôles automatiques à chaque pull request, puis exécution par AWX après fusion
Contrôles automatiques à chaque pull request, puis exécution par AWX après fusion

pipeline (exemple GitHub Actions)

# .github/workflows/ansible.yml (même principe dans Azure DevOps ou GitLab)
name: ansible-ci
on: [pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install ansible-core ansible-lint
      - run: ansible-galaxy install -r collections/requirements.yml
      - run: ansible-lint --profile production
  molecule:
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install ansible-core molecule molecule-plugins[docker]
      - run: molecule test

Pièges classiques

SymptômeCauseParade
« couldn't resolve module » dans AWXCollection absente de l'EEcollections/requirements.yml dans le projet ou EE personnalisé
Échec Kerberos uniquement dans AWXkrb5.conf / bibliothèques absents de l'EELes ajouter à l'EE, tester avec ansible-navigator
L'exécution utilise un vieux playbookProjet non synchronisé« Mettre à jour à l'exécution » ou webhook Git
Secret visible dans la sortieVariable affichée par debug ou erreurno_log: true, identifiants AWX plutôt que variables
Inventaire dynamique incompletFiltres ou droits du compte cloudVérifier la source et ses filtres, synchroniser manuellement

🔷 En contexte Citrix

Workflow type : Terraform crée la VM maître → AWX lance le rôle d'image (ANS-03) → approbation → Terraform met à jour le catalogue MCS (TF-04). Une seule action pour un nouveau mois de patchs.

Libre-service pour le support : redémarrer un VDA bloqué, vider un profil, mettre un serveur en maintenance, sans droits d'administration directs.

À retenir

  • AWX = amont communautaire ; AAP = produit Red Hat avec Hub, EDA et support.
  • Modèle de tâche = projet + inventaire + identifiants + environnement d'exécution.
  • ansible-builder construit l'EE, ansible-navigator l'utilise en local.
  • Surveys + RBAC = libre-service sans exposer les secrets.
  • CI : ansible-lint puis Molecule à chaque PR ; AWX exécute après fusion.

Auto-évaluation

Q1. Quelle différence entre AWX et Ansible Automation Platform ?

→ AWX est le projet communautaire non supporté ; AAP est le produit Red Hat supporté, qui ajoute Automation Hub privé, Event-Driven Ansible, automation mesh et collections certifiées.

Q2. Un playbook marche en local mais échoue dans AWX sur un module manquant. Pourquoi ?

→ La collection n'est pas dans l'environnement d'exécution : l'ajouter via requirements.yml du projet ou construire un EE avec ansible-builder.

Q3. Comment permettre au support de lancer une action sans connaître le mot de passe du compte de service ?

→ Créer un identifiant AWX attaché au modèle de tâche et donner au support le seul droit d'exécution sur ce modèle.

Q4. Quels contrôles placer dans la CI d'un dépôt de rôles ?

→ ansible-lint (profil production), puis Molecule (exécution, idempotence, vérifications) à chaque pull request.

Pour aller plus loin