Gestion de l'inventaire
Objectifs du chapitre
- Comprendre le rôle de l'inventaire
- Créer des inventaires statiques
- Organiser les hôtes en groupes
- Utiliser des inventaires dynamiques
1 - Qu'est-ce que l'inventaire ?
Définition
L'inventaire est la liste des machines (hôtes) que Ansible peut gérer.
Formats supportés
| Format | Extension | Usage |
|---|---|---|
| INI | .ini | Simple, lisible |
| YAML | .yml | Structuré, puissant |
| Dynamique | Script/Plugin | Cloud, CMDB |
2 - Inventaire INI (basique)
Syntaxe de base
# inventory/hosts.ini
# Hôtes sans groupe (groupe implicite "ungrouped")
server1.example.com
192.168.1.10
# Groupe webservers
[webservers]
web-01 ansible_host=192.168.1.11
web-02 ansible_host=192.168.1.12
web-03 ansible_host=192.168.1.13
# Groupe databases
[databases]
db-01 ansible_host=192.168.1.20
db-02 ansible_host=192.168.1.21
# Groupe loadbalancers
[loadbalancers]
lb-01 ansible_host=192.168.1.5
Groupes de groupes (children)
# inventory/hosts.ini
[webservers]
web-01
web-02
[databases]
db-01
[loadbalancers]
lb-01
# Groupe parent contenant d'autres groupes
[production:children]
webservers
databases
loadbalancers
# Autre exemple
[frontend:children]
webservers
loadbalancers
[backend:children]
databases
Variables dans l'inventaire
# Variables pour un hôte
[webservers]
web-01 ansible_host=192.168.1.11 http_port=80 max_clients=200
web-02 ansible_host=192.168.1.12 http_port=8080
# Variables pour un groupe
[webservers:vars]
nginx_version=1.24
document_root=/var/www/html
ansible_user=deploy
[databases:vars]
db_port=5432
backup_enabled=true
3 - Inventaire YAML
Syntaxe YAML
# inventory/hosts.yml
all:
children:
webservers:
hosts:
web-01:
ansible_host: 192.168.1.11
http_port: 80
web-02:
ansible_host: 192.168.1.12
http_port: 8080
vars:
nginx_version: "1.24"
document_root: /var/www/html
databases:
hosts:
db-01:
ansible_host: 192.168.1.20
db-02:
ansible_host: 192.168.1.21
vars:
db_port: 5432
production:
children:
webservers:
databases:
Comparaison INI vs YAML
4 - Patterns d'hôtes
Cibler des hôtes
# Tous les hôtes
ansible all -m ping
# Un groupe spécifique
ansible webservers -m ping
# Un hôte spécifique
ansible web-01 -m ping
# Plusieurs groupes (OR)
ansible 'webservers:databases' -m ping
# Intersection (AND)
ansible 'webservers:&production' -m ping
# Exclusion
ansible 'webservers:!web-03' -m ping
# Pattern avec wildcard
ansible 'web-*' -m ping
# Par numéro (range)
ansible 'web-[01:03]' -m ping
Exemples de patterns
5 - Variables d'inventaire
Hiérarchie des variables
Fichiers group_vars et host_vars
inventory/
├── hosts.ini
├── group_vars/
│ ├── all.yml # Variables pour tous
│ ├── webservers.yml # Variables groupe webservers
│ └── databases.yml # Variables groupe databases
└── host_vars/
├── web-01.yml # Variables spécifiques web-01
└── db-01.yml # Variables spécifiques db-01
# group_vars/all.yml
---
ansible_user: deploy
timezone: Europe/Paris
ntp_servers:
- ntp1.example.com
- ntp2.example.com
# group_vars/webservers.yml
---
nginx_version: "1.24"
nginx_worker_processes: auto
nginx_worker_connections: 1024
# host_vars/web-01.yml
---
nginx_worker_processes: 4
backup_enabled: true
6 - Variables de connexion
Variables Ansible intégrées
# Connexion SSH
ansible_host: 192.168.1.10 # IP ou hostname
ansible_port: 22 # Port SSH
ansible_user: deploy # Utilisateur distant
ansible_ssh_private_key_file: ~/.ssh/deploy_key
# Escalade de privilèges
ansible_become: true # Activer sudo
ansible_become_method: sudo # Méthode (sudo, su, doas)
ansible_become_user: root # Utilisateur cible
ansible_become_password: secret # Mot de passe sudo
# Python
ansible_python_interpreter: /usr/bin/python3
# Type de connexion
ansible_connection: ssh # ssh, local, docker, winrm
Exemple complet
# inventory/hosts.ini
[webservers]
web-01 ansible_host=192.168.1.11 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/aws.pem
web-02 ansible_host=192.168.1.12 ansible_user=ubuntu
[databases]
db-01 ansible_host=192.168.1.20 ansible_user=postgres ansible_become_password=dbadmin
[windows]
win-01 ansible_host=192.168.1.30 ansible_connection=winrm ansible_user=Administrator ansible_password=P@ssw0rd
[local]
localhost ansible_connection=local
7 - Inventaires dynamiques
Concept
AWS EC2
# inventory/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- eu-west-1
- eu-central-1
filters:
tag:Environment: production
instance-state-name: running
keyed_groups:
- key: tags.Role
prefix: role
- key: placement.availability_zone
prefix: az
compose:
ansible_host: public_ip_address
# Installer la collection
ansible-galaxy collection install amazon.aws
# Lister les hôtes
ansible-inventory -i inventory/aws_ec2.yml --list
# Utiliser
ansible all -i inventory/aws_ec2.yml -m ping
Script personnalisé
#!/usr/bin/env python3
# inventory/dynamic.py
import json
import argparse
def get_inventory():
return {
"webservers": {
"hosts": ["web-01", "web-02"],
"vars": {
"http_port": 80
}
},
"databases": {
"hosts": ["db-01"]
},
"_meta": {
"hostvars": {
"web-01": {"ansible_host": "192.168.1.11"},
"web-02": {"ansible_host": "192.168.1.12"},
"db-01": {"ansible_host": "192.168.1.20"}
}
}
}
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--list', action='store_true')
parser.add_argument('--host', action='store')
args = parser.parse_args()
if args.list:
print(json.dumps(get_inventory()))
elif args.host:
print(json.dumps({}))
# Rendre exécutable
chmod +x inventory/dynamic.py
# Tester
./inventory/dynamic.py --list
# Utiliser
ansible all -i inventory/dynamic.py -m ping
8 - Multi-environnements
Structure recommandée
inventory/
├── production/
│ ├── hosts.ini
│ ├── group_vars/
│ │ ├── all.yml
│ │ └── webservers.yml
│ └── host_vars/
│ └── web-01.yml
├── staging/
│ ├── hosts.ini
│ └── group_vars/
│ └── all.yml
└── development/
├── hosts.ini
└── group_vars/
└── all.yml
Utilisation
# Déploiement production
ansible-playbook -i inventory/production/ site.yml
# Déploiement staging
ansible-playbook -i inventory/staging/ site.yml
# Déploiement dev
ansible-playbook -i inventory/development/ site.yml
9 - Commandes utiles
Inspecter l'inventaire
# Lister tous les hôtes
ansible-inventory --list
# Format graphique
ansible-inventory --graph
# Afficher les variables d'un hôte
ansible-inventory --host web-01
# Valider la syntaxe
ansible-inventory -i inventory/ --list
Exemple de sortie --graph
@all:
|--@production:
| |--@webservers:
| | |--web-01
| | |--web-02
| |--@databases:
| | |--db-01
|--@ungrouped:
Résumé
Points clés
- L'inventaire définit VOS hôtes cibles
- Organisez avec des groupes hiérarchiques
- Séparez les variables dans group_vars/host_vars
- Utilisez des inventaires dynamiques pour le cloud
Exercices pratiques
- Créez un inventaire avec 3 groupes : web, db, cache
- Ajoutez des variables de groupe et d'hôte
- Testez les patterns de sélection
- Créez un inventaire multi-environnements