Aller au contenu
Infrastructure as Code medium

Le fichier ansible.cfg : ordre de chargement, sections et paramètres clés

14 min de lecture

Logo Ansible

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.

  • L’ordre de chargement des ansible.cfg (ANSIBLE_CONFIG env > ./ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg).
  • Les sections principales d’un ansible.cfg et 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).

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éSourceQuand l’utiliser
1Variable d’env ANSIBLE_CONFIG=/chemin/ansible.cfgPipeline CI/CD, scripts qui veulent forcer une config
2./ansible.cfg dans le répertoire courantConfig par projet — le cas standard
3~/.ansible.cfgConfig personnelle valable pour tous vos projets
4/etc/ansible/ansible.cfgConfig 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.

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-config dump --only-changed (sortie réelle sur le lab)
ANSIBLE_PIPELINING(/home/bob/Projets/lab-ansible/ansible.cfg) = True
CACHE_PLUGIN(/home/bob/Projets/lab-ansible/ansible.cfg) = jsonfile
CACHE_PLUGIN_CONNECTION(/home/bob/Projets/lab-ansible/ansible.cfg) = ./.ansible_facts
CACHE_PLUGIN_TIMEOUT(/home/bob/Projets/lab-ansible/ansible.cfg) = 7200
CALLBACKS_ENABLED(/home/bob/Projets/lab-ansible/ansible.cfg) = ['ansible.posix.profile_tasks', 'ansible.posix.timer']
CONFIG_FILE() = /home/bob/Projets/lab-ansible/ansible.cfg
DEFAULT_BECOME(/home/bob/Projets/lab-ansible/ansible.cfg) = True
DEFAULT_BECOME_METHOD(/home/bob/Projets/lab-ansible/ansible.cfg) = sudo
DEFAULT_FORKS(/home/bob/Projets/lab-ansible/ansible.cfg) = 10
DEFAULT_GATHERING(/home/bob/Projets/lab-ansible/ansible.cfg) = smart
DEFAULT_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_ed25519
DEFAULT_REMOTE_USER(/home/bob/Projets/lab-ansible/ansible.cfg) = ansible
DEFAULT_STDOUT_CALLBACK(/home/bob/Projets/lab-ansible/ansible.cfg) = yaml
HOST_KEY_CHECKING(/home/bob/Projets/lab-ansible/ansible.cfg) = False
INTERPRETER_PYTHON(/home/bob/Projets/lab-ansible/ansible.cfg) = /usr/bin/python3.12
PAGER(env: PAGER) = less
RETRY_FILES_ENABLED(/home/bob/Projets/lab-ansible/ansible.cfg) = False

Trois 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.

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).

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.

ansible.cfg du lab
[defaults]
inventory = ./inventory/hosts.yml
host_key_checking = False
retry_files_enabled = False
forks = 10
stdout_callback = yaml
callbacks_enabled = ansible.posix.profile_tasks, ansible.posix.timer
gathering = smart
fact_caching = jsonfile
fact_caching_connection = ./.ansible_facts
fact_caching_timeout = 7200
remote_user = ansible
private_key_file = ./ssh/id_ed25519
interpreter_python = /usr/bin/python3.12
pipelining = True
[privilege_escalation]
become = True
become_method = sudo
become_ask_pass = False

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.

Cette section contrôle le plugin de connexion SSH. Vous y mettrez typiquement :

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
control_path = ~/.ssh/cm-%%r@%%h:%%p
pipelining = True

ssh_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.

Pour démarrer un nouveau projet Ansible avec un ansible.cfg à jour et commenté, lancez :

Fenêtre de terminal
ansible-config init --disabled > ansible.cfg

La commande génère un fichier avec tous les paramètres possibles, chacun commenté (préfixé par ;) et documenté :

Extrait du template ansible-config init --disabled
[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=~/.ansible

Vous 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.

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 cfgVariable d’env
inventoryANSIBLE_INVENTORY
host_key_checkingANSIBLE_HOST_KEY_CHECKING
forksANSIBLE_FORKS
stdout_callbackANSIBLE_STDOUT_CALLBACK
private_key_fileANSIBLE_PRIVATE_KEY_FILE
becomeANSIBLE_BECOME
gatheringANSIBLE_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.

  • Ansible cherche ansible.cfg dans cet ordre : ANSIBLE_CONFIG > ./ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg. Premier trouvé gagne, pas de merge.
  • ansible-config dump --only-changed est 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.

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