Automation

Ansible en production : structurer un dépôt d’exploitation avant de l’exposer dans AWX

Organiser un dépôt Ansible utilisé par AWX avec playbooks bornés, rôles réutilisables, inventaires séparés, variables lisibles, collections versionnées et documentation d’exploitation.

20 mai 2026 ansibleawxgitopsinventoryrolesoperations

AWX ne rend pas un dépôt Ansible propre par magie. Il rend surtout son contenu plus visible, plus facile à lancer et parfois plus facile à mal utiliser. Avant d’exposer des playbooks dans une interface, il faut donc structurer le dépôt comme un outil d’exploitation : périmètres clairs, inventaires séparés, rôles réutilisables, variables compréhensibles et documentation minimale.

Le scénario est simple : une équipe administre un parc Linux avec quelques playbooks déjà présents dans Git. Les exécutions se font encore depuis des postes d’administration. AWX doit centraliser les actions récurrentes, pas devenir le lieu où l’on improvise la structure manquante du dépôt.

Séparer playbooks, rôles et inventaires

Un dépôt exploitable doit permettre de comprendre rapidement ce qui est exécutable, ce qui est réutilisable et ce qui décrit les cibles. Les playbooks exposés dans AWX doivent être peu nombreux et orientés action. Les rôles portent la logique réutilisable. Les inventaires décrivent les environnements et les groupes.

text repository-layout.txt
ansible-operations/
playbooks/
  check-linux-baseline.yml
  check-disk-usage.yml
  restart-approved-service.yml
  patch-selected-package.yml
  apply-linux-baseline.yml
roles/
  linux_baseline/
  ssh_hardening/
  package_management/
  monitoring_agent/
inventories/
  preprod/hosts.yml
  production/hosts.yml
group_vars/
  all.yml
  production_web.yml
  production_tools.yml
collections/requirements.yml
README.md

Cette structure n’est pas sophistiquée, mais elle rend la revue possible. Un template AWX pointe vers un playbook identifiable. Le playbook appelle un rôle. L’inventaire limite la cible. Les variables sont versionnées.

Garder les playbooks exposés courts

Un playbook utilisé comme job AWX doit être une entrée contrôlée. Il ne devrait pas contenir toute la logique technique. Il prépare le contexte, vérifie les paramètres et appelle les rôles nécessaires. Cela réduit le risque de duplication et rend le comportement plus facile à relire.

yaml apply-linux-baseline.yml
---
- name: Apply Linux baseline
hosts: "{{ target_group }}"
become: true
gather_facts: true
pre_tasks:
  - name: Reject restricted groups
    ansible.builtin.fail:
      msg: "This playbook cannot target restricted hosts"
    when: target_group in ['restricted', 'production_databases']
roles:
  - role: linux_baseline
  - role: monitoring_agent
post_tasks:
  - name: Show kernel and distribution
    ansible.builtin.debug:
      msg: "{{ inventory_hostname }} {{ ansible_distribution }} {{ ansible_distribution_version }} kernel {{ ansible_kernel }}"

Le rôle peut évoluer avec ses tests et ses defaults. Le playbook reste lisible pour l’équipe qui valide le template AWX.

Nommer les inventaires pour empêcher les erreurs

Les inventaires doivent être explicites. Un fichier hosts.yml unique finit souvent par contenir trop de groupes et trop de cas particuliers. Séparer préproduction et production évite déjà une classe d’erreurs. Séparer les groupes sensibles évite qu’un job standard les touche par accident.

yaml inventories/production/hosts.yml
all:
children:
  production_web:
    hosts:
      web01.example.local:
      web02.example.local:
  production_tools:
    hosts:
      tools01.example.local:
  production_databases:
    hosts:
      db01.example.local:
  restricted:
    children:
      production_databases:

Dans AWX, un template de maintenance doit pointer vers l’inventaire attendu. Si un inventaire peut être choisi au lancement, il faut avoir une raison forte et une validation côté playbook.

Versionner les collections

Un playbook qui fonctionne aujourd’hui peut changer de comportement après une mise à jour de collection. Pour une exploitation stable, les collections doivent être déclarées et installées de manière prévisible. AWX peut utiliser des execution environments, mais le dépôt doit tout de même dire ce dont il dépend.

yaml collections/requirements.yml
---
collections:
- name: ansible.posix
  version: "1.5.4"
- name: community.general
  version: "8.6.0"

La version exacte dépend du contexte, mais l’intention doit être claire : l’exécution AWX ne doit pas dépendre d’un environnement implicite que personne ne sait reconstruire.

Documenter les jobs publiés

Le README ne doit pas être un manuel complet. Il doit surtout décrire les playbooks exposés, leurs effets et leurs limites. C’est ce qui permet à un reviewer de comprendre ce qu’un bouton AWX va réellement faire.

text README-jobs.txt
Job : check-disk-usage
Effet : lecture uniquement
Cibles : preprod, production_web, production_tools
Credential : read-only

Job : restart-approved-service
Effet : redémarre nginx, telegraf ou chronyd
Cibles : production_web, production_tools
Credential : maintenance
Validation : service_facts après redémarrage

Job : apply-linux-baseline
Effet : applique les rôles linux_baseline et monitoring_agent
Cibles : préproduction par défaut, production sur changement validé
Credential : restricted-admin

Cette documentation sert aussi de contrat. Si un playbook commence à faire plus que ce qui est écrit, la revue doit le voir.

Prévoir les branches AWX

Le dépôt peut être propre mais dangereux si AWX pointe sur une branche instable. Une pratique simple consiste à exposer la production depuis une branche stable ou un tag, et à réserver les branches de travail aux tests. Le choix exact dépend du workflow Git, mais il doit être volontaire.

text branch-model.txt
main
Revue et intégration des changements validés

production
Branche suivie par les templates AWX production

feature/*
Développement et tests sur projet AWX séparé

Tags
Points de retour possibles pour un changement sensible

AWX doit synchroniser le bon projet au bon moment. Une exécution production ne devrait pas partir d’un commit non relu simplement parce qu’un projet suit une branche trop vivante.

Conclusion

Structurer un dépôt Ansible avant AWX n’est pas une question esthétique. C’est une condition d’exploitation. Les playbooks exposés doivent être courts, les rôles réutilisables, les inventaires explicites, les dépendances versionnées et les effets documentés.

AWX devient alors un exécuteur contrôlé de code versionné. Sans cette base, il devient une interface qui donne une apparence de gouvernance à des automatisations encore trop libres. Le bon ordre reste simple : rendre le dépôt lisible, borner les actions, tester les rôles, puis seulement publier les templates.