
Le format INI est l’inventaire historique d’Ansible — simple, lisible, idéal pour les petits parcs et les premiers pas. Sa syntaxe est minimaliste : un fichier texte avec des groupes entre crochets et des hôtes ligne par ligne. Pas de hiérarchie complexe, pas d’objets imbriqués.
C’est le format à connaître pour le RHCE EX294 car certains exercices en présentent encore. En production en 2026, il reste valable pour des inventaires < 30 hôtes ; au-delà, le format YAML est plus expressif et maintenable.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Écrire un inventaire INI complet avec groupes et variables.
- Définir des variables d’hôte sur la même ligne.
- Définir des variables de groupe dans la section
[<groupe>:vars]. - Créer des sous-groupes avec
[<groupe>:children]. - Utiliser les ranges (
web[01:05]) pour générer des séquences.
Anatomie d’un fichier INI minimal
Section intitulée « Anatomie d’un fichier INI minimal »[webservers]web1.labweb2.lab
[dbservers]db1.labTrois éléments suffisent : un nom de groupe entre crochets, puis la liste des hôtes du groupe (un par ligne). Chaque hôte est identifié par son hostname ou son IP. Les lignes vides entre groupes sont autorisées et améliorent la lisibilité.
Variables sur la même ligne
Section intitulée « Variables sur la même ligne »Pour passer des paramètres SSH ou métier directement au niveau d’un hôte :
[webservers]web1.lab ansible_host=10.10.20.21 http_port=8080web2.lab ansible_host=10.10.20.22 http_port=8081
[dbservers]db1.lab ansible_host=10.10.20.31 ansible_port=2222ansible_host dit à Ansible comment se connecter (l’IP réelle), distincte du hostname affiché. ansible_port override le port SSH par défaut. Tous les paramètres sont du clé=valeur sans guillemets — limitation importante : pas d’espaces dans les valeurs sans échappement.
Variables de groupe
Section intitulée « Variables de groupe »Quand toutes les machines d’un groupe partagent une variable, la mettre une seule fois dans [<groupe>:vars] :
[webservers]web1.labweb2.lab
[webservers:vars]http_port=8080worker_count=4ansible_user=ansiblehttp_port=8080 et worker_count=4 s’appliquent à web1.lab et web2.lab. Plus propre que de répéter les mêmes valeurs sur chaque ligne. Mauvaise pratique : utiliser [webservers:vars] pour des configs longues — préférer le pattern group_vars/webservers.yml à côté de l’inventaire.
Sous-groupes (:children)
Section intitulée « Sous-groupes (:children) »Pour grouper plusieurs groupes dans un méta-groupe :
[webservers]web1.labweb2.lab
[dbservers]db1.lab
[prod:children]webserversdbservers
[prod:vars]deploy_env=productionLe groupe prod contient les hôtes de webservers et dbservers. Pratique pour cibler tous les serveurs de prod en une commande : ansible prod -m ping. La variable deploy_env=production est appliquée à tous les hôtes des sous-groupes.
Ranges — générer des séquences
Section intitulée « Ranges — générer des séquences »Quand vous avez 10 webservers nommés web01 à web10, pas besoin de tout taper :
[webservers]web[01:10].labdb[a:c].labweb[01:10] génère web01, web02, …, web10. db[a:c] génère dba, dbb, dbc. Les ranges acceptent chiffres (avec ou sans padding zéro) et lettres. Indispensable pour des fermes de serveurs nommés selon une convention numérique.
Hôte spécial localhost
Section intitulée « Hôte spécial localhost »Pour exécuter des tâches sur le control node lui-même :
[control]localhost ansible_connection=localansible_connection=local dit à Ansible de ne pas passer par SSH — exécution directe sur le control node. Indispensable pour des tâches qui parlent à un cloud, un Kubernetes, un Vault depuis le control node.
Commentaires
Section intitulée « Commentaires »Un # en début de ligne (ou après un espace) commente :
# Inventaire de production[webservers]web1.lab # frontend principalweb2.lab # frontend backup# web3.lab # désactivé temporairement (en maintenance)Permet de documenter l’inventaire sans toucher au schéma.
Exemple complet — un homelab type
Section intitulée « Exemple complet — un homelab type »[webservers]web1.lab ansible_host=10.10.20.21web2.lab ansible_host=10.10.20.22
[dbservers]db1.lab ansible_host=10.10.20.31
[control]localhost ansible_connection=local
[lab:children]webserversdbservers
[lab:vars]ansible_user=ansibleansible_ssh_private_key_file=~/.ssh/lab_ed25519ansible_python_interpreter=/usr/bin/python3.12Ce qu’on lit : 3 hôtes managés (web1, web2, db1) regroupés par rôle, regroupés à leur tour dans un méta-groupe lab, avec des paramètres SSH partagés. Le control node est aussi déclaré pour des tâches delegate_to: localhost.
Vérifier avec ansible-inventory
Section intitulée « Vérifier avec ansible-inventory »Toujours valider l’inventaire avec :
ansible-inventory -i inventory/hosts.ini --graphSortie :
@all: |--@control: | |--localhost |--@lab: | |--@dbservers: | | |--db1.lab | |--@webservers: | | |--web1.lab | | |--web2.lab |--@ungrouped:Le groupe spécial @ungrouped affiche les hôtes hors de tout groupe — vide ici, normal.
Limites du format INI
Section intitulée « Limites du format INI »| Limite | Conséquence | Solution |
|---|---|---|
| Pas de listes | Une variable vaut une string, jamais une liste | Passer au YAML |
| Pas de dicts imbriqués | db_config={...} impossible directement | Passer au YAML ou group_vars/ |
| Pas de commentaires inline propres | # interprété parfois mal selon le parser | Préférer commentaires en début de ligne |
| Chaînes avec espaces | description=Mon serveur casse | Quoter ou passer au YAML |
| Réutilisation difficile | Pas d’ancres comme YAML (& *) | Passer au YAML |
Règle pragmatique : INI pour un parc < 30 hôtes avec config simple. YAML dès qu’il y a des listes, dicts, ou plus de 30 hôtes.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
Unable to parse inventory | Mauvais format clé=valeur (espace autour de =) | Pas d’espace : ansible_host=10.10.20.21 |
| Variable d’hôte ignorée | Mise dans [group:vars] au lieu de la ligne hôte | Sur la ligne hôte si spécifique, dans :vars si partagée |
| Sous-groupe vide | [prod:children] cite un groupe qui n’existe pas | Vérifier orthographe avec ansible-inventory --graph |
Range web[01:05] ne marche pas | Tirets - au lieu de deux-points : | Toujours : séparateur |
| Hôte non trouvé | Hostname mal orthographié | ansible-inventory --host web1.lab pour vérifier |
À retenir
Section intitulée « À retenir »- Format INI = simple, idéal pour < 30 hôtes ou prise en main débutant.
[group]liste les hôtes ;[group:vars]définit les variables partagées.[group:children]crée des sous-groupes,[group:vars]du parent s’applique aux enfants.- Ranges :
web[01:10]génère 10 hôtes nommésweb01-web10. - Limites : pas de listes, pas de dicts imbriqués — passer au YAML quand ça serre.
localhost ansible_connection=localpour exécuter sur le control node.