Aller au contenu
Infrastructure as Code medium

Aide-mémoire RHCE EX294 — Ansible en une page (commandes, modules, pièges)

10 min de lecture

Logo Ansible

Cette page condense en une seule lecture tout ce qu’il faut avoir en tête le jour de l’EX294. Commandes ansible-*, modules essentiels par catégorie, ansible.cfg minimal, syntaxes Vault, FQCN, pièges YAML qui font perdre des points. À lire la veille de l’examen et à garder ouverte pendant les mocks (lab rhce/mock-ex294).

L’EX294 est performance-based : aucun QCM, vous écrivez des playbooks sur un environnement RHEL/AlmaLinux live. Le score se calcule sur des objectifs vérifiés automatiquement. Un playbook qui ne passe pas l’objectif = 0 sur cet objectif. Pas de point partiel.

BesoinCommande
Tester la connexion Ansibleansible all -m ansible.builtin.ping
Lister inventaireansible-inventory --graph
Voir variables d’un hostansible-inventory --host db1.lab
Doc d’un moduleansible-doc ansible.builtin.copy
Lister tous les modules d’une collectionansible-doc -l community.general
Lancer un playbookansible-playbook -i inventory.yml site.yml
Mode dry-runansible-playbook --check --diff site.yml
Limiter à un hostansible-playbook --limit web1.lab site.yml
Filtrer par tagsansible-playbook --tags config site.yml
Vault encrypt fichieransible-vault encrypt secret.yml
Vault encrypt variable inlineansible-vault encrypt_string 'value' --name 'key'
Vault editansible-vault edit secret.yml
Vault rekeyansible-vault rekey secret.yml
Lancer playbook avec vaultansible-playbook --vault-password-file=.vault_pass site.yml
Inspecter config activeansible-config dump --only-changed
Lister tâches sans exécuteransible-playbook --list-tasks site.yml
Lister hosts ciblésansible-playbook --list-hosts site.yml
Lint qualité productionansible-lint --profile production site.yml
Installer collectionansible-galaxy collection install -r requirements.yml
Installer rôle Galaxyansible-galaxy role install geerlingguy.docker
[defaults]
inventory = inventory/hosts.yml
remote_user = ansible
host_key_checking = False
roles_path = ./roles
collections_path = ./collections
forks = 10
stdout_callback = yaml
deprecation_warnings = False
[privilege_escalation]
become = True
become_method = sudo
become_user = root
[ssh_connection]
pipelining = True

À placer dans le répertoire de travail au début de l’examen — précédence locale > home > /etc.

ModuleUsage type
ansible.builtin.copyDéposer un fichier (avec content: ou src:)
ansible.builtin.templateDéposer fichier paramétré Jinja2 (src: file.j2)
ansible.builtin.fileÉtat d’un fichier/dossier (state: directory|absent|touch)
ansible.builtin.lineinfileUne seule ligne dans un fichier (regexp: obligatoire)
ansible.builtin.blockinfileBloc de lignes (marker: configurable)
ansible.builtin.fetchRécupérer un fichier de la cible vers le control node
community.general.archive / ansible.builtin.unarchivetar.gz, zip
ModuleUsage
ansible.builtin.dnfRHEL/AlmaLinux paquets (name:, state: present|latest|absent)
ansible.builtin.systemd_serviceActiver + démarrer (state: started, enabled: true)
ansible.builtin.cronTâche planifiée
ModuleUsage
ansible.builtin.userCréer user (name:, uid:, group:, shell:, password:)
ansible.builtin.groupCréer group (name:, gid:)
ansible.posix.authorized_keyDéposer clé SSH (user:, key:)
community.general.sudoersRègle sudo dédiée
ModuleUsage
ansible.posix.firewalldpermanent: true, immediate: true
ansible.posix.sebooleanActiver un booléen SELinux (state: true, persistent: true)
ansible.builtin.sefcontext (community.general)Contexte SELinux
community.general.lvolCréer un LV
community.general.filesystemFormater (xfs, ext4)
ansible.posix.mountMonter + fstab
ModuleUsage
ansible.builtin.command / shellCommandes (changed_when: false pour lecture)
ansible.builtin.assertVérification d’une condition
ansible.builtin.failÉchec explicite
ansible.builtin.debugAffichage de variables (var: ou msg:)
ansible.builtin.uriHTTP request
ansible.builtin.wait_forAttendre un port / état
mode: "0644" # ← TOUJOURS quoté (sinon octal interprété en décimal → 420)
- hosts: db1.lab
become: true # ← niveau play : toutes les tâches en sudo
tasks:
- ansible.builtin.copy:
...
become_user: appuser # ← override niveau task
- ansible.builtin.command: curl --version
register: curl_out
changed_when: false # ← lecture seule, pas idempotent
- ansible.builtin.debug:
var: curl_out.stdout
when: curl_out.rc == 0
- ansible.builtin.user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
loop:
- { name: alice, uid: 2001 }
- { name: bob, uid: 2002 }
loop_control:
label: "{{ item.name }}" # ← masque le contenu détaillé en sortie
when:
- ansible_facts.os_family == "RedHat"
- ansible_facts.distribution_major_version | int >= 9
- inventory_hostname in groups['webservers']
Fenêtre de terminal
ansible-vault encrypt_string 'SuperSecret' --name 'admin_password'
admin_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
39373335366336323033666336323535...
Fenêtre de terminal
ansible-playbook --vault-id dev@.vault_pass_dev --vault-id prod@.vault_pass_prod site.yml

Priorité des variables (descendante, RHCE objectif explicite)

Section intitulée « Priorité des variables (descendante, RHCE objectif explicite) »
  1. --extra-vars (CLI) — prioritaire absolue
  2. Block vars
  3. Task vars
  4. include_vars
  5. set_fact / registered vars
  6. Play vars (vars:)
  7. vars/main.yml d’un rôle
  8. Host facts
  9. host_vars/
  10. group_vars/ (du plus spécifique au plus général)
  11. defaults/main.yml d’un rôle — prioritaire la plus basse
  12. Command line role default

🔍 Mémoire pratique : --extra-vars écrase tout le reste. defaults/main.yml se fait écraser par tout le reste.

roles/myrole/
├── defaults/main.yml # variables par défaut (faible précédence)
├── vars/main.yml # variables internes (haute précédence)
├── tasks/main.yml # tâches principales
├── handlers/main.yml # handlers (notifiés par notify:)
├── templates/ # *.j2
├── files/ # fichiers à copy:
├── meta/main.yml # dependencies, supported_platforms
└── meta/argument_specs.yml # validation des inputs (Ansible 2.11+)
ErreurConséquence
mode: 0644 (non quoté)YAML lit octal → décimal 420 → mode 0644 peut devenir 0644 dans certains parseurs ; toujours mode: "0644"
name: Migration with_* vers loop: (terminé par :)YAML 1.2 lit comme mapping. Quoter : name: "..."
dnf: state=present name=httpd (vieux style)Toujours YAML structuré : dnf: { state: present, name: httpd } ou multi-ligne
Oublier permanent: true sur firewalldRègle non persistante après reboot — permanent: true, immediate: true systématique
Oublier python3-libselinux côté cibletemplate:/copy: plantent si SELinux=enforcing
name: Démarrer httpd: finit par :YAML mapping — quoter
Confondre import_* (static) et include_* (dynamic)Tags/conditions ne se propagent pas pareillement — voir Import vs Include
ÉtapeTempsAction
Lecture des consignes5-10 minLire les 12-15 tâches en entier avant d’écrire une ligne
Setup ansible.cfg + inventaire5-10 minPoser le ansible.cfg minimal + tester ansible all -m ping
Tâches faciles1hFaire les 8-9 tâches simples d’abord (validation rapide)
Tâches complexes1h30Rôles, Vault, SELinux, LVM/XFS — les plus longues
Vérification30 minRe-lancer chaque playbook, vérifier l’idempotence (changed=0 au 2e run)
Buffer30 minMarge pour les pièges de dernière minute

🔍 Règle d’or : vérifier au fur et à mesure. Ne pas attendre la fin pour relancer tous les playbooks — un bug détecté à la 4e heure coûte 30 min de panique.

Fenêtre de terminal
# Pour chaque playbook
ansible-playbook playbook.yml # 1er run
ansible-playbook playbook.yml | grep -E 'changed=[1-9]' # 2e run : doit être vide
# Vérifier qu'un service est bien actif après reboot
ansible <host> -m ansible.builtin.systemd_service -a 'name=httpd' -b
# → "ActiveState": "active"
# → "UnitFileState": "enabled"
# Vérifier un fichier déposé
ansible <host> -m ansible.builtin.stat -a 'path=/tmp/file.txt' -b
# Vérifier un user
ansible <host> -m ansible.builtin.command -a 'id appuser' -b
  • ansible-doc <module> — la doc complète est embarquée dans l’EE de l’examen.
  • ansible-doc -l | grep <mot> — retrouver le FQCN d’un module par mot-clé.
  • man ansible-playbook — options CLI rapides.
  • /usr/share/doc/ansible*/ — docs locales sur RHEL.

L’examen vous autorise la documentation locale (ansible-doc, man). Aucun accès internet.

  • Performance-based : on écrit des playbooks. Pas de QCM.
  • ansible.cfg projet en premier — précédence locale > home > /etc.
  • FQCN systématique : ansible.builtin.copy, jamais copy.
  • mode: toujours quoté ("0644").
  • changed_when: false sur toute commande de lecture.
  • firewalld : permanent: true, immediate: true.
  • python3-libselinux côté cible si SELinux enforcing.
  • Vérifier l’idempotence : 2e run doit avoir changed=0.
  • ansible-doc est votre meilleur ami pendant l’examen.

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