Aller au contenu
Infrastructure as Code medium

Inventaire statique YAML Ansible : format moderne et expressif

9 min de lecture

Logo Ansible

Le format YAML est le format moderne et recommandé pour les inventaires Ansible en 2026. Plus expressif que l'INI : il accepte les listes, les dicts imbriqués, les ancres (& / *), et reste lisible sur des inventaires volumineux. C'est le format adopté par les rôles Galaxy de qualité et la plupart des projets en équipe.

L'inconvénient face à l'INI : la syntaxe est plus stricte (indentation 2 espaces, : après chaque clé). Mais une fois le réflexe acquis, l'expressivité justifie largement l'effort.

  • Écrire un inventaire YAML complet avec la structure all.children.<groupe>.hosts.<host>.
  • Définir des variables au niveau host, groupe, ou top-level (all.vars).
  • Créer des sous-groupes imbriqués sans syntaxe spéciale.
  • Utiliser des listes et dicts dans les variables (impossible en INI).
  • Migrer un inventaire INI existant vers YAML.
---
all:
children:
webservers:
hosts:
web1.lab:
web2.lab:
dbservers:
hosts:
db1.lab:

La structure est strictement hiérarchique :

  • all est le groupe racine implicite (tous les hôtes y appartiennent).
  • children: liste les sous-groupes.
  • hosts: liste les hôtes du groupe.
  • Chaque hôte est une clé (avec : final), valeur vide ou dict de variables.

Le : après web1.lab: n'est pas une faute, c'est la syntaxe YAML pour dire « cette clé existe, valeur vide ou nested ». Sans le :, YAML refuse le fichier.

Pour qu'Ansible sache comment se connecter :

---
all:
children:
webservers:
hosts:
web1.lab:
ansible_host: 10.10.20.21
http_port: 8080
web2.lab:
ansible_host: 10.10.20.22
http_port: 8081
dbservers:
hosts:
db1.lab:
ansible_host: 10.10.20.31
ansible_port: 2222

Avantage YAML : indentation explicite, types préservés (http_port: 8080 est un int, pas une string). En INI, tout est string par défaut.

Variables partagées par tous les hôtes d'un groupe :

---
all:
children:
webservers:
hosts:
web1.lab:
web2.lab:
vars:
http_port: 8080
worker_count: 4
nginx_config:
worker_processes: auto
worker_connections: 1024

vars: est au même niveau que hosts:. Chaque hôte du groupe webservers reçoit ces 3 variables. Important : nginx_config est un dict, impossible à exprimer en INI sans astuce JSON.

Pour des variables qui s'appliquent à tous les hôtes :

---
all:
vars:
ansible_user: ansible
ansible_ssh_private_key_file: ~/.ssh/lab_ed25519
ansible_python_interpreter: /usr/bin/python3.12
children:
webservers:
hosts:
web1.lab:
web2.lab:
dbservers:
hosts:
db1.lab:

all.vars: est l'équivalent YAML du [all:vars] INI. Idéal pour les paramètres SSH partagés (utilisateur, clé, interpréteur Python).

Pour grouper plusieurs groupes :

---
all:
children:
webservers:
hosts:
web1.lab:
web2.lab:
dbservers:
hosts:
db1.lab:
prod:
children:
webservers:
dbservers:
vars:
deploy_env: production

prod.children: liste les groupes membres. Les hôtes de webservers et dbservers héritent de deploy_env: production. Plus lisible qu'en INI où les :children sont disséminés.

Imbriquer profondément est possible :

prod:
children:
europe:
children:
webservers:
dbservers:
asia:
children:
webservers_asia:

Impossible en INI, naturel en YAML :

all:
vars:
backup_servers:
- backup1.lab
- backup2.lab
- backup3.lab
allowed_admins:
- alice
- bob
- charlie

Utilisable directement dans un playbook :

- name: Distribuer les clés admin
ansible.posix.authorized_key:
user: "{{ item }}"
key: "{{ lookup('file', 'admin_keys/' + item + '.pub') }}"
loop: "{{ allowed_admins }}"

Avec INI, il faudrait passer par un fichier group_vars/all.yml séparé.

all:
children:
webservers:
vars:
nginx:
version: "1.26.1"
worker_processes: auto
gzip:
enabled: true
level: 6
types:
- text/plain
- text/css
- application/json

Hiérarchie complète d'une config nginx exposée comme variables. Accès dans un template Jinja : {{ nginx.gzip.level }} ou {{ nginx.gzip.types | join(' ') }}.

Quand plusieurs hôtes partagent une portion identique de config :

all:
vars:
common_ssh_args: &common_ssh
ansible_user: ansible
ansible_port: 2222
ansible_ssh_private_key_file: ~/.ssh/lab_ed25519
children:
webservers:
hosts:
web1.lab:
<<: *common_ssh
ansible_host: 10.10.20.21
web2.lab:
<<: *common_ssh
ansible_host: 10.10.20.22

&common_ssh définit une ancre, <<: *common_ssh fusionne le contenu dans le host. Évite de répéter ansible_user, ansible_port, etc. sur chaque ligne. Avancé, utiliser avec parcimonie pour préserver la lisibilité.

/home/bob/Projets/lab-ansible/inventory/hosts.yml
---
all:
vars:
ansible_user: ansible
ansible_ssh_private_key_file: "{{ inventory_dir }}/../ssh/id_ed25519"
ansible_python_interpreter: /usr/bin/python3.12
children:
control:
hosts:
control-node.lab:
ansible_host: 10.10.20.10
webservers:
hosts:
web1.lab:
ansible_host: 10.10.20.21
web2.lab:
ansible_host: 10.10.20.22
vars:
http_port: 8080
environment: production
dbservers:
hosts:
db1.lab:
ansible_host: 10.10.20.31
vars:
postgres_version: 17
rhce_lab:
children:
webservers:
dbservers:

Ce qu'on lit : 4 hôtes managés, paramètres SSH partagés au top, deux groupes par rôle avec leurs variables propres, un méta-groupe rhce_lab qui regroupe webservers + dbservers.

Cas typique : vous reprenez un projet historique en INI et passez à YAML.

Avant (INI) :

[webservers]
web1.lab ansible_host=10.10.20.21
web2.lab ansible_host=10.10.20.22
[webservers:vars]
http_port=8080
[dbservers]
db1.lab ansible_host=10.10.20.31
[prod:children]
webservers
dbservers

Après (YAML) :

---
all:
children:
webservers:
hosts:
web1.lab:
ansible_host: 10.10.20.21
web2.lab:
ansible_host: 10.10.20.22
vars:
http_port: 8080
dbservers:
hosts:
db1.lab:
ansible_host: 10.10.20.31
prod:
children:
webservers:
dbservers:

Astuce : ansible-inventory -i hosts.ini --list --yaml génère automatiquement la version YAML, point de départ propre pour la migration.

SymptômeCauseFix
Failed to parse inventoryIndentation incohérente (mélange espaces/tabs)Toujours 2 espaces, jamais de tabs
Variable host invisiblePas de : après le nom de l'hôteweb1.lab: (avec :) puis indentation
vars: vu comme un hostvars: mis sous hosts: au lieu d'à côtévars: au même niveau que hosts:
Listes converties en stringsMauvaise syntaxe YAML pour les listes- item (tiret + espace) en début de ligne indentée
Booléens YAML 1.1 piégeuxenabled: yes interprété comme TruePréférer enabled: true (YAML 1.2 strict)
  • Format YAML = recommandé en 2026. Plus expressif, plus lisible sur gros inventaires.
  • Structure stricte : all.children.<groupe>.hosts.<host>.
  • vars: au même niveau que hosts: pour des variables de groupe.
  • all.vars: pour les variables partagées par tous les hôtes.
  • Listes et dicts dans les variables, impossible en INI, naturel en YAML.
  • Ancres & / * pour réutiliser des blocs sans dupliquer.
  • Migration INI→YAML : ansible-inventory --list --yaml génère automatiquement.

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