Aller au contenu
Infrastructure as Code medium

Écrire du code Ansible : variables, facts, contrôle de flux, templates Jinja2

6 min de lecture

Logo Ansible

Cette section couvre la couche cœur métier d’Ansible : tout ce qui transforme un assemblage de tâches en code maintenable, lisible et réutilisable. Au programme : structure de projet 2026, playbooks avec pre_tasks/tasks/handlers/tags, 22 niveaux de précédence des variables (objectif RHCE explicite), contrôle de flux (when, loop, block/rescue/always), et templates Jinja2. C’est la section la plus volumineuse du parcours et celle qui pèse ~70 % de l’examen RHCE EX294.

  • Structurer un projet Ansible avec ansible.cfg, inventory/, group_vars/, host_vars/, roles/, collections/, playbooks/ ;
  • Maîtriser YAML 1.2 et ses pièges (booléens, multilines, ancres) sans tomber dans les classiques ;
  • Écrire des plays multiples par playbook avec pre_tasks, tasks, post_tasks, handlers, roles ;
  • Manipuler variables, facts, magic vars et la précédence officielle Ansible (22 niveaux) ;
  • Contrôler le flux avec when:, loop:, block/rescue/always, failed_when, changed_when, any_errors_fatal ;
  • Générer des fichiers via le module template + Jinja2 (filtres, tests, whitespace control).

Avant d’attaquer cette section, vous devez avoir :

  • Validé le quiz Découvrir Ansible (idempotence, push SSH, ansible.cfg) ;
  • Validé le quiz Premiers pas (lab opérationnel, premier playbook, debug) ;
  • Un lab fonctionnel avec ansible all -m ping qui répond pong sur les 4 hôtes.

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 m’attarde sur la précédence des variables, pourquoi je préfère loop: même quand with_items marche, pourquoi un playbook lisible bat toujours un playbook concis.

C’est dans cette section que se jouent les plus gros bugs subtils d’une infra Ansible. J’ai passé des nuits à débugger des playbooks où une variable group_vars/all.yml était silencieusement écrasée par un --extra-vars mal documenté. Ce sont les sujets que la doc officielle expédie en deux paragraphes alors qu’ils méritent une heure de pratique. Les sections qui suivent compilent les habitudes que je n’aurais jamais relâchées sur un projet sérieux.

Cinq positions tranchées que cette section assume :

  • YAML 1.2 strict, jamais YAML 1.1. true/false partout, jamais yes/no/on/off. Une casse de version YAML peut transformer enable_https: yes en string. Le pipeline de lint doit refuser les booléens YAML 1.1.
  • FQCN obligatoire (ansible.builtin.copy, jamais copy). Le module non qualifié peut être shadowé par une collection installée plus tard. Lisibilité + future-proofing — c’est aussi un objectif RHCE explicite.
  • loop: partout, plus de with_items/with_dict sauf cas exotique justifié en commentaire. La syntaxe moderne est plus expressive et c’est la norme RHCE 2026.
  • Précédence connue par cœur des 5 niveaux qui comptent : defaults rôle (1) < group_vars (5–6) < host_vars (7) < task vars: (16) < --extra-vars (22). Le reste, on le retrouve dans la doc — mais ces 5 sont vitaux.
  • changed_when + failed_when pour toute tâche command:/shell:. Sans ça, command: est changed: true à chaque exécution et casse l’idempotence. Si vous écrivez command:, écrivez immédiatement changed_when:.

Cinq anti-patterns que cette section refuse — chacun vu plusieurs fois en revue de code :

  • command: dnf install -y nginx alors que ansible.builtin.dnf existe. Cas typique du « ça marche une fois ». Le module dédié gère l’idempotence, le check mode, le diff. Toujours chercher le module dédié avant command:/shell:.
  • Variables critiques dans vars/main.yml d’un rôle. Précédence trop haute, l’utilisateur ne peut pas surcharger. Toute variable destinée à être customisée va dans defaults/main.ymlvars/ réservé aux constantes internes.
  • ignore_errors: true pour faire taire un bug. Le bug ne disparaît pas, il devient invisible — et explose 6 mois plus tard sur une autre task qui dépend implicitement du résultat. block/rescue/always ou failed_when ciblé, jamais ignore_errors global.
  • Templates Jinja2 sans validate:. Générer un nginx.conf cassé sur 50 serveurs en parallèle, c’est 50 nginx qui refusent de redémarrer. validate: 'nginx -t -c %s' valide avant écriture — non négociable pour toute conf critique.
  • Playbooks « clever » qui exploitent 4 niveaux de Jinja2 imbriqués pour économiser 3 lignes. Le code que vous lirez à 2 h du matin doit être trivial. Privilégier la lisibilité, toujours.

Le parcours est séquentiel : chaque sous-section suppose acquis ce qui précède.

Mise au point sur YAML, structure de projet, conventions de style — la base avant de coder le moindre playbook avancé.

Le format de référence : plays multiples, pre/post-tasks, handlers, tags, parallélisme, asynchrone, délégation.

La couche la plus dense pour la RHCE : les 22 niveaux de précédence, les magic vars, le register:/set_fact, les lookups, les filtres Jinja2 essentiels.

when:, loop:, block/rescue/always, failed_when, changed_when, ignore_errors, any_errors_fatal.

Génération de fichiers : syntaxe Jinja2, filtres profonds, tests, module template, comparaison avec lineinfile.

Cette section couvre environ 70 % des objectifs RHCE EX294 :

Objectif RHCECouvert par
Créer playbooks simples et avancésPlaybooks/Plays et tasks
Utiliser variables (host, group, register, facts, magic)Variables-facts (8 pages)
Utiliser conditionnels et bouclesContrôle de flux (7 pages)
Utiliser handlersPlaybooks/Handlers
Utiliser tagsPlaybooks/Tags
Manipuler les factsVariables-facts/Facts et magic vars
Gérer le parallélismePlaybooks/Parallélisme et stratégies
Gérer les erreurs (block/rescue, failed_when)Contrôle de flux/Block-rescue-always + failed_when
Templates Jinja2Templates Jinja2 (5 pages)
Mode check et diffPlaybooks/check et diff

Ce qui n’est pas dans cette section : Modules (section dédiée modules/), Rôles (section dédiée roles/), Collections (section dédiée collections/), Vault (section dédiée securite-vault/).

Le quiz ecrire-code/quiz (à venir) totalise environ 50 questions sur les 5 sous-sections, alignées sur les objectifs RHCE EX294. Chaque question pointe vers le guide unitaire qui justifie la réponse.

Une fois ecrire-code/ validé, vous attaquez Modules (les modules de base pour la RHCE : dnf, yum, service, systemd, file, copy, template, user, group, firewalld, selinux, mount, lvol, parted, cron, git, archive, unarchive, uri, wait_for).

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