Inventaires et hôtes
L'inventaire : la liste de tes serveurs
Avant qu'Ansible puisse automatiser quoi que ce soit, il doit savoir sur quelles machines agir. C'est le rôle de l'inventaire : un fichier qui liste tous tes serveurs cibles.
Par défaut, Ansible cherche son inventaire dans /etc/ansible/hosts, mais tu peux en spécifier
un différent avec le flag -i :
# Utiliser un inventaire personnalisé
ansible all -i inventory.ini -m ping
# Ou avec un playbook
ansible-playbook -i inventory.ini deploy.yml
L'inventaire peut être un simple fichier texte (INI ou YAML) ou un script dynamique qui interroge une API. Pour commencer, un fichier statique suffit largement.
Format INI : simple et lisible
Le format INI est le plus courant pour débuter. Chaque ligne est un hôte, les crochets définissent des groupes.
# Hôtes individuels (sans groupe)
192.168.1.10
mon-serveur.example.com
# Groupe webservers
[webservers]
web01.example.com
web02.example.com
192.168.1.20
# Groupe databases
[databases]
db01.example.com
db02.example.com
# Plage d'hôtes (web01 à web05)
[frontend]
web[01:05].example.com
Le groupe spécial all contient automatiquement tous les hôtes de l'inventaire.
Le groupe ungrouped contient les hôtes non assignés à un groupe.
Format YAML : plus structuré
Le format YAML est plus verbeux mais plus lisible pour les inventaires complexes et s'intègre naturellement avec le reste de l'écosystème Ansible.
all:
children:
webservers:
hosts:
web01.example.com:
web02.example.com:
192.168.1.20:
databases:
hosts:
db01.example.com:
db02.example.com:
Variables d'hôte
Tu peux associer des variables directement à un hôte dans l'inventaire. Ces variables contrôlent comment Ansible se connecte à la machine.
[webservers]
# ansible_host : adresse IP ou nom DNS réel
web01 ansible_host=192.168.1.20 ansible_user=ubuntu
# ansible_port : port SSH (défaut : 22)
web02 ansible_host=192.168.1.21 ansible_port=2222
# ansible_ssh_private_key_file : clé SSH spécifique
web03 ansible_host=192.168.1.22 ansible_ssh_private_key_file=~/.ssh/id_web
ansible_host
L'adresse IP ou le nom DNS réel de la machine. Utile quand le nom d'hôte dans l'inventaire est différent de l'adresse réseau.
ansible_user
L'utilisateur SSH à utiliser pour la connexion. Surcharge la valeur définie dans ansible.cfg.
ansible_port
Le port SSH de la machine cible. Par défaut 22. À changer si ton serveur écoute sur un port personnalisé.
ansible_ssh_private_key_file
Chemin vers la clé privée SSH à utiliser pour cette machine. Pratique quand chaque serveur a sa propre clé.
Variables de groupe
Plutôt que de répéter les mêmes variables sur chaque hôte, tu peux les définir
au niveau du groupe avec la section [nom_groupe:vars].
[webservers]
web01.example.com
web02.example.com
web03.example.com
# Variables appliquées à tous les hôtes du groupe webservers
[webservers:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/id_web
http_port=80
app_env=production
Bonne pratique : Pour les projets plus importants, place les variables
dans des répertoires dédiés host_vars/ et group_vars/ à côté de ton inventaire.
Chaque fichier YAML porte le nom de l'hôte ou du groupe.
Groupes de groupes
Tu peux créer des groupes qui contiennent d'autres groupes avec la syntaxe
[nom_groupe:children]. Très utile pour organiser les environnements.
[webservers_prod]
web01.prod.example.com
web02.prod.example.com
[databases_prod]
db01.prod.example.com
[webservers_staging]
web01.staging.example.com
[databases_staging]
db01.staging.example.com
# production regroupe tous les serveurs de prod
[production:children]
webservers_prod
databases_prod
# staging regroupe tous les serveurs de staging
[staging:children]
webservers_staging
databases_staging
Avec cette structure, ansible production -m ping cible à la fois
webservers_prod et databases_prod en une seule commande.
Inventaire dynamique
Dans un environnement cloud ou conteneurisé, les adresses IP changent constamment — maintenir un fichier statique à la main devient vite impossible. L'inventaire dynamique résout ce problème.
Au lieu d'un fichier texte, tu fournis un script ou plugin qui interroge une API (AWS, Azure, GCP, VMware…) et retourne la liste des machines en JSON. Ansible l'exécute automatiquement avant chaque run.
# Utiliser le plugin aws_ec2 (inclus dans amazon.aws)
# Fichier : aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- eu-west-1
filters:
instance-state-name: running
keyed_groups:
- key: tags.Environment
prefix: env
Pour commencer avec un homelab ou des machines fixes, l'inventaire statique est largement suffisant. L'inventaire dynamique devient utile dès que tu travailles avec des infrastructures qui évoluent automatiquement (auto-scaling, Kubernetes, etc.).
Commandes utiles pour inspecter l'inventaire
# Lister tous les hôtes et variables au format JSON
ansible-inventory -i inventory.ini --list
# Afficher l'arborescence des groupes et hôtes
ansible-inventory -i inventory.ini --graph
# Exemple de sortie de --graph :
# @all:
# |--@production:
# | |--@webservers_prod:
# | | |--web01.prod.example.com
# | | |--web02.prod.example.com
# | |--@databases_prod:
# | | |--db01.prod.example.com
# Afficher les variables d'un hôte spécifique
ansible-inventory -i inventory.ini --host web01.example.com
# Tester la connectivité sur un groupe
ansible webservers -i inventory.ini -m ping
- L'inventaire liste tous les serveurs cibles — sans lui, Ansible ne sait pas où agir.
- Format INI : rapide à écrire. Format YAML : plus lisible pour les structures complexes.
- Les variables d'hôte clés :
ansible_host,ansible_user,ansible_port,ansible_ssh_private_key_file. - Les variables de groupe (
[groupe:vars]) évitent la répétition sur chaque hôte. - Les groupes de groupes (
[groupe:children]) permettent d'organiser par environnement. ansible-inventory --graphpour visualiser la structure,--listpour voir toutes les variables.