RousselTMLEARNING

Article · Ansible : de la découverte à l'expertise

L'inventaire : statique, dynamique, groupes et variables

1. Le rôle de l'inventaire #

Dire à Ansible sur quelles machines agir.

Qu'est-ce qu'un inventaire ? #

L'inventaire est la liste des machines (hôtes) que gère Ansible, organisées en groupes. Un playbook ne cible jamais une adresse IP directement : il cible un groupe ou un pattern défini dans l'inventaire. C'est ce qui permet de rejouer la même automatisation sur le développement, la recette ou la production en changeant simplement d'inventaire.

Hiérarchie d'un inventaire Ansible : all, groupes et hôtes
Tout hôte appartient au groupe implicite all.

Ansible fournit deux groupes implicites : all (tous les hôtes) et ungrouped (les hôtes qui n'appartiennent à aucun autre groupe).

Où est l'inventaire par défaut ? #

Par défaut Ansible lit /etc/ansible/hosts. En pratique, on versionne l'inventaire avec le projet et on le désigne avec -i ou dans ansible.cfg :

# Dans le dépôt du projet
cat ansible.cfg
[defaults]
inventory = ./inventories/lab/hosts.ini
host_key_checking = False

# Ou en ligne de commande
ansible all -i inventories/prod/hosts.ini -m ping

2. Écrire un inventaire statique #

Les formats INI et YAML.

Format INI #

Le format INI est le plus concis. Les groupes sont entre crochets, [groupe:children] déclare un groupe de groupes et [groupe:vars] des variables communes.

# inventories/lab/hosts.ini
bastion.lab ansible_host=192.168.56.5

[webservers]
web1.lab ansible_host=192.168.56.11
web2.lab ansible_host=192.168.56.12

[dbservers]
db1.lab ansible_host=192.168.56.21 ansible_port=2222

[prod:children]
webservers
dbservers

[prod:vars]
ansible_user=deploy
ansible_python_interpreter=/usr/bin/python3

Format YAML #

Le format YAML est plus verbeux mais fortement structuré, idéal quand les variables deviennent nombreuses :

# inventories/lab/hosts.yml
all:
  children:
    webservers:
      hosts:
        web1.lab: { ansible_host: 192.168.56.11 }
        web2.lab: { ansible_host: 192.168.56.12 }
    dbservers:
      hosts:
        db1.lab:
          ansible_host: 192.168.56.21
          ansible_port: 2222
  vars:
    ansible_user: deploy

Plages d'hôtes #

Évitez de répéter les lignes : les plages numériques et alphabétiques sont supportées.

[webservers]
web[01:20].example.com

[dbservers]
db-[a:c].example.com

3. Variables : group_vars et host_vars #

Séparer les données du code.

Arborescence recommandée #

Plutôt que de surcharger le fichier d'inventaire, placez les variables dans des répertoires dédiés. Ansible les charge automatiquement :

projet/
├── ansible.cfg
├── inventories/
│   └── lab/
│       ├── hosts.ini
│       ├── group_vars/
│       │   ├── all.yml          # valable pour tous les hôtes
│       │   ├── webservers.yml   # valable pour le groupe webservers
│       │   └── dbservers/
│       │       ├── main.yml
│       │       └── vault.yml    # secrets chiffrés (voir Ansible Vault)
│       └── host_vars/
│           └── db1.lab.yml      # valable pour un seul hôte
└── site.yml
# inventories/lab/group_vars/webservers.yml
http_port: 8080
nginx_worker_processes: auto

# inventories/lab/host_vars/db1.lab.yml
postgres_max_connections: 400

Ordre de précédence #

Quand une même variable est définie à plusieurs endroits, la plus spécifique gagne : host_vars > group_vars d'un groupe enfant > group_vars d'un groupe parent > group_vars/all. Les variables passées avec -e (extra vars) l'emportent sur tout.

ansible-inventory -i inventories/lab/hosts.ini --host db1.lab
ansible webservers -i inventories/lab/hosts.ini -m debug -a "var=http_port"
ansible-playbook site.yml -e http_port=9090      # priorité maximale
Erreur Courante : Redéfinir la même variable dans all.yml et dans un playbook sans connaître l'ordre de précédence produit des comportements incompréhensibles. Gardez une seule source de vérité par variable.

4. Inspecter et cibler l'inventaire #

ansible-inventory et les patterns.

La commande ansible-inventory #

Avant d'exécuter quoi que ce soit, vérifiez comment Ansible interprète votre inventaire :

ansible-inventory -i inventories/lab/hosts.ini --list          # JSON complet avec variables
ansible-inventory -i inventories/lab/hosts.ini --graph         # vue arborescente
ansible-inventory -i inventories/lab/hosts.ini --host web1.lab # variables d'un hôte
ansible-inventory -i inventories/lab/hosts.ini --list --yaml   # export YAML
Résultat de ansible-inventory --graph
Exemple de sortie pour l'inventaire ci-dessus.

Les patterns de ciblage #

Les patterns permettent de cibler un sous-ensemble de l'inventaire dans les commandes ad-hoc, les playbooks (hosts:) et avec --limit :

PatternSignification
all ou *Tous les hôtes
webserversUn groupe
webservers:dbserversUnion de deux groupes
webservers:&prodIntersection : dans webservers ET prod
webservers:!web2.labExclusion
web*.labWildcard sur le nom
~web[0-9]+Expression régulière
ansible 'webservers:&prod' -m ping
ansible-playbook site.yml --limit 'webservers:!web2.lab'
ansible-playbook site.yml --limit @retry_hosts.txt     # relancer sur les hôtes en échec
ansible all -i inventories/lab/hosts.ini --list-hosts   # voir qui sera ciblé

5. Inventaires dynamiques #

Quand les machines changent tout le temps.

Principe #

Dans le cloud ou sur Kubernetes, les machines apparaissent et disparaissent : maintenir un fichier à la main est impossible. Un inventory plugin interroge une source de vérité (AWS, Azure, GCP, VMware, NetBox...) et génère l'inventaire à la volée, groupes et variables compris.

# Lister les plugins disponibles
ansible-doc -t inventory -l | head

# Installer la collection AWS puis son SDK
ansible-galaxy collection install amazon.aws
pip install boto3 botocore

Exemple : EC2 par tags #

# inventories/aws/aws_ec2.yml  (le nom doit finir par aws_ec2.yml)
plugin: amazon.aws.aws_ec2
regions: [eu-west-3]
filters:
  tag:Environment: prod
  instance-state-name: running
keyed_groups:
  - key: tags.Role
    prefix: role
hostnames:
  - private-ip-address
compose:
  ansible_host: private_ip_address
ansible-inventory -i inventories/aws/aws_ec2.yml --graph
ansible role_web -i inventories/aws/aws_ec2.yml -m ping

Script ou inventaire mixte #

Un exécutable qui renvoie du JSON (--list et --host) fonctionne aussi. Vous pouvez pointer un répertoire contenant fichiers statiques, plugins et scripts : Ansible fusionne l'ensemble.

ansible-playbook site.yml -i inventories/lab/     # un dossier = tous les inventaires fusionnés
Bonne Pratique : Mettez les plugins dynamiques en cache (cache: true, cache_timeout: 300) pour accélérer les exécutions et ne pas atteindre les limites d'API du fournisseur.

📄 Ansible : l'inventaire (statique, dynamique, groupes et variables) →

Mon suivi

  • ⏱ Durée estimée : ≈ 17 min

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

✉️ Poser une question

Articles recommandés

Linux vs Unix : Le Guide Complet des Commandes et Distributions

Comprenez les différences entre Linux et Unix, explorez les distributions (serveur, desktop, ligh...

Ansible : les commandes Ad-Hoc

Exécuter des actions immédiates sur un parc de serveurs avec ansible : modules ping, command, she...

Ansible : structurer son code avec les rôles

Créer, organiser et réutiliser des rôles Ansible : arborescence, defaults, tasks, handlers, templ...

Ansible : générer des fichiers dynamiques avec Jinja2 et les facts

Créer des fichiers de configuration dynamiques : templates Jinja2, variables, facts, filtres, bou...

Ansible : gérer la sécurité (Vault, SSH, privilèges et secrets)

Sécuriser Ansible : Ansible Vault, authentification SSH par clés, become et sudo, no_log, durciss...

Ansible : gérer son infrastructure avec des playbooks (Infrastructure as Code)

Écrire des playbooks de production : structure d'un projet, plays, handlers, tags, strategy seria...

Ansible : piloter ses automatisations avec une interface graphique (AWX, Semaphore, AAP)

Comparer et installer les interfaces graphiques d'Ansible : AWX, Ansible Automation Platform, Sem...

Ansible : aller plus loin (tests, qualité, CI/CD et performance)

Industrialiser Ansible : ansible-lint, yamllint, Molecule, intégration continue, collections, exe...

Bonnes pratiques Vagrant : des environnements reproductibles et rapides

Bonnes pratiques Vagrant : Vagrantfile versionné, boxes épinglées, provisioning idempotent, multi...