Aller au contenu principal

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

FormatExtensionUsage
INI.iniSimple, lisible
YAML.ymlStructuré, puissant
DynamiqueScript/PluginCloud, 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

  1. Créez un inventaire avec 3 groupes : web, db, cache
  2. Ajoutez des variables de groupe et d'hôte
  3. Testez les patterns de sélection
  4. Créez un inventaire multi-environnements

← Installation | Commandes ad-hoc →