Aller au contenu
Infrastructure as Code medium

Inventaire statique INI Ansible : syntaxe historique simple et lisible

3 min de lecture

Logo Ansible

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.

  • É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.
[webservers]
web1.lab
web2.lab
[dbservers]
db1.lab

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

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=8080
web2.lab ansible_host=10.10.20.22 http_port=8081
[dbservers]
db1.lab ansible_host=10.10.20.31 ansible_port=2222

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

Quand toutes les machines d’un groupe partagent une variable, la mettre une seule fois dans [<groupe>:vars] :

[webservers]
web1.lab
web2.lab
[webservers:vars]
http_port=8080
worker_count=4
ansible_user=ansible

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

Pour grouper plusieurs groupes dans un méta-groupe :

[webservers]
web1.lab
web2.lab
[dbservers]
db1.lab
[prod:children]
webservers
dbservers
[prod:vars]
deploy_env=production

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

Quand vous avez 10 webservers nommés web01 à web10, pas besoin de tout taper :

[webservers]
web[01:10].lab
db[a:c].lab

web[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.

Pour exécuter des tâches sur le control node lui-même :

[control]
localhost ansible_connection=local

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

Un # en début de ligne (ou après un espace) commente :

# Inventaire de production
[webservers]
web1.lab # frontend principal
web2.lab # frontend backup
# web3.lab # désactivé temporairement (en maintenance)

Permet de documenter l’inventaire sans toucher au schéma.

/home/bob/Projets/lab-ansible/inventory/hosts.ini
[webservers]
web1.lab ansible_host=10.10.20.21
web2.lab ansible_host=10.10.20.22
[dbservers]
db1.lab ansible_host=10.10.20.31
[control]
localhost ansible_connection=local
[lab:children]
webservers
dbservers
[lab:vars]
ansible_user=ansible
ansible_ssh_private_key_file=~/.ssh/lab_ed25519
ansible_python_interpreter=/usr/bin/python3.12

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

Toujours valider l’inventaire avec :

Fenêtre de terminal
ansible-inventory -i inventory/hosts.ini --graph

Sortie :

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

LimiteConséquenceSolution
Pas de listesUne variable vaut une string, jamais une listePasser au YAML
Pas de dicts imbriquésdb_config={...} impossible directementPasser au YAML ou group_vars/
Pas de commentaires inline propres# interprété parfois mal selon le parserPréférer commentaires en début de ligne
Chaînes avec espacesdescription=Mon serveur casseQuoter ou passer au YAML
Réutilisation difficilePas 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.

SymptômeCauseFix
Unable to parse inventoryMauvais format clé=valeur (espace autour de =)Pas d’espace : ansible_host=10.10.20.21
Variable d’hôte ignoréeMise dans [group:vars] au lieu de la ligne hôteSur la ligne hôte si spécifique, dans :vars si partagée
Sous-groupe vide[prod:children] cite un groupe qui n’existe pasVérifier orthographe avec ansible-inventory --graph
Range web[01:05] ne marche pasTirets - au lieu de deux-points :Toujours : séparateur
Hôte non trouvéHostname mal orthographiéansible-inventory --host web1.lab pour vérifier
  • 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és web01-web10.
  • Limites : pas de listes, pas de dicts imbriqués — passer au YAML quand ça serre.
  • localhost ansible_connection=local pour exécuter sur le control node.

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