
Vous tapez ansible-playbook et le comportement diffère de celui d’un collègue qui lance le même playbook. La cause est presque toujours le même : un fichier ansible.cfg chargé sans que vous le sachiez. Ce guide explique l’ordre de chargement des configurations, les sections clés ([defaults], [privilege_escalation], [ssh_connection]), les paramètres essentiels à connaître pour le RHCE 2026, et la commande qui répond toujours à la question « quelle valeur est active ? » : ansible-config dump --only-changed.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- L’ordre de chargement des
ansible.cfg(ANSIBLE_CONFIGenv >./ansible.cfg>~/.ansible.cfg>/etc/ansible/ansible.cfg). - Les sections principales d’un
ansible.cfget leur rôle. - Les paramètres essentiels au RHCE :
inventory,host_key_checking,forks,gathering,stdout_callback,become,private_key_file. - Comment générer un template propre (
ansible-config init --disabled). - Comment diagnostiquer la config active (
ansible-config dump --only-changed).
L’ordre de chargement
Section intitulée « L’ordre de chargement »Ansible cherche son fichier de configuration dans cet ordre exact, et s’arrête au premier trouvé. C’est crucial : un fichier ignoré n’est jamais merge avec un autre — c’est tout l’un, ou tout l’autre.
| Priorité | Source | Quand l’utiliser |
|---|---|---|
| 1 | Variable d’env ANSIBLE_CONFIG=/chemin/ansible.cfg | Pipeline CI/CD, scripts qui veulent forcer une config |
| 2 | ./ansible.cfg dans le répertoire courant | Config par projet — le cas standard |
| 3 | ~/.ansible.cfg | Config personnelle valable pour tous vos projets |
| 4 | /etc/ansible/ansible.cfg | Config système installée par un paquet distrib |
Le piège classique : vous avez un ~/.ansible.cfg perso qui définit inventory = ~/.ansible/hosts. Vous cd dans un projet qui a son propre ./ansible.cfg. Le fichier projet gagne et votre inventaire perso est ignoré complètement. Il n’y a pas de fusion section par section. Si une valeur n’est pas dans le fichier projet, c’est la valeur par défaut Ansible qui s’applique, pas celle de votre ~/.ansible.cfg.
Vérifier la config active : ansible-config dump
Section intitulée « Vérifier la config active : ansible-config dump »Quand un comportement vous étonne, première commande à taper : ansible-config dump --only-changed. Elle affiche tous les paramètres modifiés par rapport aux défauts Ansible, avec la source de chaque valeur.
ANSIBLE_PIPELINING(/home/bob/Projets/lab-ansible/ansible.cfg) = TrueCACHE_PLUGIN(/home/bob/Projets/lab-ansible/ansible.cfg) = jsonfileCACHE_PLUGIN_CONNECTION(/home/bob/Projets/lab-ansible/ansible.cfg) = ./.ansible_factsCACHE_PLUGIN_TIMEOUT(/home/bob/Projets/lab-ansible/ansible.cfg) = 7200CALLBACKS_ENABLED(/home/bob/Projets/lab-ansible/ansible.cfg) = ['ansible.posix.profile_tasks', 'ansible.posix.timer']CONFIG_FILE() = /home/bob/Projets/lab-ansible/ansible.cfgDEFAULT_BECOME(/home/bob/Projets/lab-ansible/ansible.cfg) = TrueDEFAULT_BECOME_METHOD(/home/bob/Projets/lab-ansible/ansible.cfg) = sudoDEFAULT_FORKS(/home/bob/Projets/lab-ansible/ansible.cfg) = 10DEFAULT_GATHERING(/home/bob/Projets/lab-ansible/ansible.cfg) = smartDEFAULT_HOST_LIST(/home/bob/Projets/lab-ansible/ansible.cfg) = ['/home/bob/Projets/lab-ansible/inventory/hosts.yml']DEFAULT_PRIVATE_KEY_FILE(/home/bob/Projets/lab-ansible/ansible.cfg) = /home/bob/Projets/lab-ansible/ssh/id_ed25519DEFAULT_REMOTE_USER(/home/bob/Projets/lab-ansible/ansible.cfg) = ansibleDEFAULT_STDOUT_CALLBACK(/home/bob/Projets/lab-ansible/ansible.cfg) = yamlHOST_KEY_CHECKING(/home/bob/Projets/lab-ansible/ansible.cfg) = FalseINTERPRETER_PYTHON(/home/bob/Projets/lab-ansible/ansible.cfg) = /usr/bin/python3.12PAGER(env: PAGER) = lessRETRY_FILES_ENABLED(/home/bob/Projets/lab-ansible/ansible.cfg) = FalseTrois choses à lire dans cette sortie. CONFIG_FILE() indique le fichier ansible.cfg détecté — vous savez immédiatement lequel a été chargé. La source entre parenthèses précise pour chaque paramètre s’il vient du fichier (chemin) ou d’une variable d’environnement (env:). Seuls les paramètres modifiés sont listés — les défauts Ansible ne polluent pas la sortie.
Pour le dump complet (utile au moins une fois pour explorer ce qui existe) : ansible-config dump. Vous obtenez les 400+ paramètres de la config Ansible, avec leur valeur effective et leur source.
Les sections d’un ansible.cfg
Section intitulée « Les sections d’un ansible.cfg »Un ansible.cfg contient des sections au format INI. Voici la liste complète des sections disponibles, capturée par ansible-config init --disabled | grep '^\[' :
[defaults][privilege_escalation][persistent_connection][connection][colors][selinux][diff][galaxy][inventory][netconf_connection]En pratique, trois sections couvrent 90 % des cas : [defaults], [privilege_escalation], [ssh_connection] (alias de [connection] pour SSH). Les autres sont pour des cas avancés (color customisation, plugins NETCONF pour les équipements réseau, intégration SELinux fine).
Les paramètres essentiels par section
Section intitulée « Les paramètres essentiels par section »Voici l’ansible.cfg du lab (que vous retrouvez sur tous les projets de la formation), avec une explication ligne par ligne des paramètres clés. C’est la base à connaître pour le RHCE.
[defaults]inventory = ./inventory/hosts.ymlhost_key_checking = Falseretry_files_enabled = Falseforks = 10stdout_callback = yamlcallbacks_enabled = ansible.posix.profile_tasks, ansible.posix.timergathering = smartfact_caching = jsonfilefact_caching_connection = ./.ansible_factsfact_caching_timeout = 7200remote_user = ansibleprivate_key_file = ./ssh/id_ed25519interpreter_python = /usr/bin/python3.12pipelining = True
[privilege_escalation]become = Truebecome_method = sudobecome_ask_pass = FalseSection [defaults] — paramètres généraux
Section intitulée « Section [defaults] — paramètres généraux »inventory désigne le fichier ou répertoire d’inventaire à utiliser par défaut. Sans ce paramètre, vous devez passer -i hosts.yml à chaque commande. Avec, ansible all -m ping trouve directement les hôtes.
host_key_checking = False désactive la vérification de l’empreinte SSH du serveur. C’est pratique sur un lab où les VMs sont reprovisionnées souvent (l’empreinte change), dangereux en prod où vous voulez détecter un MITM. Pour les labs, c’est OK ; pour la prod, gardez à True et gérez ~/.ssh/known_hosts correctement.
forks = 10 définit le nombre d’hôtes traités en parallèle. Le défaut Ansible est 5 — sur un lab de 4 VMs, 10 suffit largement. Sur une fleet de 100 serveurs, montez à 50 pour réduire la durée d’exécution.
gathering = smart contrôle la collecte des facts. Trois valeurs : implicit (collecte à chaque play, défaut), explicit (uniquement si gather_facts: true est explicite), smart (collecte si pas déjà en cache). Le mode smart couplé à fact_caching divise par 5 à 10 le temps total sur des playbooks répétitifs.
fact_caching = jsonfile active la mise en cache des facts collectés. Combiné à fact_caching_connection (chemin du cache) et fact_caching_timeout (durée de validité, ici 7200 s = 2 h), Ansible évite de re-collecter ~100 facts par hôte à chaque run. Énorme gain sur fleet de 50+ serveurs.
stdout_callback = yaml change l’affichage de la sortie d’Ansible. Le défaut affiche du JSON inline difficile à lire ; yaml reformate en YAML structuré. Recommandé pour tout poste de dev. Variantes utiles : dense (compact), debug (verbeux), default (legacy).
callbacks_enabled active des callbacks supplémentaires. ansible.posix.profile_tasks ajoute un récap des durées par tâche en fin de play (utile pour identifier ce qui ralentit). ansible.posix.timer affiche le temps total. Voir section sur les callbacks.
remote_user = ansible est le user SSH par défaut. Évite de l’écrire dans chaque playbook ou inventaire.
private_key_file désigne la clé privée SSH à utiliser. Indispensable quand vous avez plusieurs paires de clés et que celle d’Ansible n’est pas dans ~/.ssh/id_rsa.
interpreter_python = /usr/bin/python3.12 force l’interpréteur Python côté managed nodes. Sans ce paramètre, Ansible essaie d’auto-détecter, ce qui peut basculer vers python3.6 sur des distributions hétérogènes. À cibler explicitement quand vos managed nodes sont uniformes.
pipelining = True active le SSH pipelining : Ansible envoie le module Python directement via stdin de SSH plutôt que de passer par un fichier temporaire. Gain de 30-50 % sur les playbooks lourds. Compatible avec requiretty désactivé sur les nodes (cas par défaut sur AlmaLinux 10).
Section [privilege_escalation] — élévation de privilèges
Section intitulée « Section [privilege_escalation] — élévation de privilèges »become = True active par défaut l’élévation de privilèges (sudo) pour toutes les tâches du play. Vous pouvez ensuite désactiver localement avec become: false sur une tâche qui n’a pas besoin de root. Inverse : become = False (défaut Ansible) impose d’écrire become: true partout où vous voulez sudo.
become_method = sudo définit l’outil d’élévation. Alternatives : su, doas, pbrun, runas (Windows). Sur RHEL/AlmaLinux/Ubuntu, sudo est universel.
become_ask_pass = False convient quand le user est configuré avec NOPASSWD: ALL côté managed node (cas du lab). Si vos cibles requièrent un mot de passe sudo, mettez True et Ansible vous le demandera au lancement.
Section [ssh_connection] (alias [connection])
Section intitulée « Section [ssh_connection] (alias [connection]) »Cette section contrôle le plugin de connexion SSH. Vous y mettrez typiquement :
[ssh_connection]ssh_args = -o ControlMaster=auto -o ControlPersist=60scontrol_path = ~/.ssh/cm-%%r@%%h:%%ppipelining = Truessh_args impose des options SSH supplémentaires (utile pour proxy jump, alias d’hôtes, multiplexage). control_path définit l’emplacement du socket de multiplexage SSH. Sur la plupart des labs, les défauts conviennent — vous n’avez qu’à activer pipelining.
Générer un template propre
Section intitulée « Générer un template propre »Pour démarrer un nouveau projet Ansible avec un ansible.cfg à jour et commenté, lancez :
ansible-config init --disabled > ansible.cfgLa commande génère un fichier avec tous les paramètres possibles, chacun commenté (préfixé par ;) et documenté :
[defaults]# (boolean) By default, Ansible will issue a warning when received from a task# action (module or action plugin). These warnings can be silenced by adjusting# this setting to False.;action_warnings=True
# (boolean) When enabled, this option allows conditionals with non-boolean results; to be used. A deprecation warning will be emitted in these cases.;allow_broken_conditionals=False
# (path) The default root path for Ansible config files on the controller.;home=~/.ansibleVous décommentez ensuite uniquement les paramètres dont vous avez besoin — la grande majorité reste aux défauts Ansible. C’est la méthode propre pour démarrer un projet, plutôt que de copier-coller un ansible.cfg trouvé sur StackOverflow.
Variables d’environnement équivalentes
Section intitulée « Variables d’environnement équivalentes »Chaque paramètre ansible.cfg a sa variable d’environnement équivalente, préfixée ANSIBLE_. Pratique pour des overrides ponctuels en CI ou sur la ligne de commande.
| Paramètre cfg | Variable d’env |
|---|---|
inventory | ANSIBLE_INVENTORY |
host_key_checking | ANSIBLE_HOST_KEY_CHECKING |
forks | ANSIBLE_FORKS |
stdout_callback | ANSIBLE_STDOUT_CALLBACK |
private_key_file | ANSIBLE_PRIVATE_KEY_FILE |
become | ANSIBLE_BECOME |
gathering | ANSIBLE_GATHERING |
Exemple : ANSIBLE_FORKS=50 ansible-playbook site.yml boost ponctuellement le parallélisme sans toucher au fichier. Le précédence est : ligne de commande > variables d’env > ansible.cfg. Cela rend les variables d’env idéales pour les pipelines CI/CD.
Pièges fréquents
Section intitulée « Pièges fréquents »À retenir
Section intitulée « À retenir »- Ansible cherche
ansible.cfgdans cet ordre :ANSIBLE_CONFIG>./ansible.cfg>~/.ansible.cfg>/etc/ansible/ansible.cfg. Premier trouvé gagne, pas de merge. ansible-config dump --only-changedest votre outil de diagnostic numéro un — il montre quel paramètre est actif et d’où il vient.- Trois sections couvrent 90 % des cas :
[defaults],[privilege_escalation],[ssh_connection]. - Les paramètres essentiels au RHCE :
inventory,host_key_checking,forks,gathering,stdout_callback,become,private_key_file,interpreter_python. - Pour démarrer un nouveau projet :
ansible-config init --disabled > ansible.cfg. Décommentez uniquement les paramètres nécessaires. - Chaque paramètre a son équivalent variable d’env
ANSIBLE_*, prioritaire sur le fichier — utile en CI/CD.