Aller au contenu
Infrastructure as Code medium

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

11 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)
community.general.sefcontextContexte SELinux (mapping de contexte de fichier)
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 (de la plus forte à la plus faible)

Section intitulée « Priorité des variables (de la plus forte à la plus faible) »

Ordre officiel de la documentation Ansible, de la priorité la plus haute à la plus basse. Ce qui est plus haut dans la liste écrase ce qui est plus bas :

  1. --extra-vars / -e (ligne de commande) : priorité absolue, écrase tout le reste
  2. Paramètres d'include (vars: d'un include_role ou include_tasks)
  3. Paramètres de rôle (roles: [{ role: r, x: val }], ou vars: d'un include_role)
  4. set_fact et variables issues de register:
  5. include_vars
  6. Task vars (vars: au niveau d'une tâche)
  7. Block vars (vars: au niveau d'un block)
  8. vars/main.yml d'un rôle (role vars)
  9. vars_files du play, puis vars_prompt
  10. Play vars (vars: du play)
  11. Host facts et set_fact mis en cache
  12. host_vars/ (playbook puis inventaire)
  13. group_vars/, du plus spécifique au plus général
  14. defaults/main.yml d'un rôle : priorité la plus basse

🔍 Le piège de l'examen : le niveau d'une variable bat l'ordre chronologique d'exécution. set_fact l'emporte sur include_vars (juste en dessous) même si l'include_vars s'exécute après dans le playbook. De même, vars_files et le vars/main.yml d'un rôle écrasent les vars: du play. Mesuré sur ansible-core 2.20.1.

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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn