Leçon 3 / 6
Leçon 03 · Ansible

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 :

Terminal
# 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.

inventory.ini
# 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.

inventory.yml
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.

inventory.ini — variables d'hôte
[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.

connexion
👤

ansible_user

L'utilisateur SSH à utiliser pour la connexion. Surcharge la valeur définie dans ansible.cfg.

authentification
🔌

ansible_port

Le port SSH de la machine cible. Par défaut 22. À changer si ton serveur écoute sur un port personnalisé.

connexion
🗝️

ansible_ssh_private_key_file

Chemin vers la clé privée SSH à utiliser pour cette machine. Pratique quand chaque serveur a sa propre clé.

authentification

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

inventory.ini — variables de groupe
[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.

inventory.ini — groupes de groupes
[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.

Exemple : inventaire dynamique AWS EC2
# 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

Terminal
# 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
// à retenir
  • 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 --graph pour visualiser la structure, --list pour voir toutes les variables.