Les inventaires dynamiques Ansible
Mise à jour :
Dans Ansible, les inventaires dynamiques offrent une alternative puissante aux inventaires statiques en permettant de découvrir automatiquement les hôtes et leurs métadonnées à partir de sources externes. Cette fonctionnalité est essentielle dans les environnements cloud, virtualisés ou dynamiques, où les machines sont fréquemment créées, détruites ou redéployées.
Contrairement aux fichiers d’inventaire statiques où les hôtes sont définis manuellement, un inventaire dynamique repose sur des plugins ou scripts personnalisés qui interrogent des API ou des bases de données pour générer en temps réel la liste des hôtes disponibles. Ces inventaires s’adaptent ainsi automatiquement à l’état réel de votre infrastructure.
Avec les plugins intégrés pour AWS, Azure, GCP, Docker,
libvirt, Zabbix, et bien d’autres, Ansible permet de s’interfacer de
manière fluide avec presque tous les types d’environnements. En combinant cette
souplesse avec une configuration centralisée dans le fichier ansible.cfg
, il
devient possible d’automatiser à grande échelle sans maintenir manuellement des
fichiers d’inventaire.
Dans ce chapitre, nous allons explorer les principaux plugins d’inventaire dynamique, apprendre à les configurer, et voir comment créer des scripts sur mesure pour des cas spécifiques, tout en gardant à l’esprit les bonnes pratiques de sécurité et de performance.
Les Plugins d’Inventaire Dynamique
Ansible propose une large sélection de plugins d’inventaire dynamique capables d’interroger automatiquement des services tiers pour découvrir et inventorier les hôtes disponibles. Ces plugins s’appuient souvent sur les API des fournisseurs cloud, des services de virtualisation, ou des systèmes de monitoring comme Zabbix.
L’utilisation d’un plugin permet de maintenir un inventaire toujours à jour, sans intervention manuelle, ce qui est particulièrement adapté aux infrastructures cloud-native et évolutives.
Fonctionnement général
Un plugin d’inventaire dynamique repose sur :
- un fichier de configuration YAML (conventionnellement nommé d’après le
plugin, comme
aws_ec2.yml
,libvirt.yml
, etc.), - un plugin activé dans le fichier
ansible.cfg
, - parfois des collections Ansible ou des bibliothèques Python à installer.
Lorsque vous exécutez une commande Ansible avec un inventaire dynamique, le plugin :
- Se connecte au service externe (API, hyperviseur, etc.),
- Récupère la liste des machines disponibles,
- Organise ces machines en groupes d’hôtes avec des variables,
- Génère un inventaire que vous pouvez visualiser via
ansible-inventory
.
Liste des principaux plugins disponibles
Voici une sélection de plugins couramment utilisés, classés par environnement cible :
Plugin | Environnement |
---|---|
amazon.aws.aws_ec2 | Amazon EC2 |
azure.azcollection.azure_rm | Microsoft Azure |
google.cloud.gcp_compute | Google Cloud Platform |
community.docker.docker_containers | Conteneurs Docker |
community.general.proxmox | Proxmox VE |
community.libvirt.libvirt | libvirt / KVM |
community.zabbix.zabbix_inventory | Zabbix |
community.general.incus | Incus |
kubernetes.core.k8s | Kubernetes |
Afficher la liste des plugins installés
Pour consulter tous les plugins d’inventaire disponibles dans votre environnement Ansible :
ansible-doc -t inventory -l
Extrait de sortie possible :
amazon.aws.aws_ec2 EC2 inventory sourcecommunity.docker.docker_container Docker inventory sourcecommunity.zabbix.zabbix_inventory Zabbix inventory source
Consulter la documentation d’un plugin
Pour chaque plugin, une documentation détaillée est disponible directement depuis la ligne de commande :
ansible-doc -t inventory <nom_du_plugin>
Par exemple :
ansible-doc -t inventory amazon.aws.aws_ec2
Cela vous permet de connaître :
- les options configurables (filtres, tags, régions…),
- les variables générées,
- les exigences d’authentification,
- les groupes créés dynamiquement (
keyed_groups
).
Mise en œuvre concrète
Dans cette section, nous allons configurer et tester trois cas concrets d’inventaires dynamiques : libvirt, AWS EC2 et Incus (LXD). Vous découvrirez comment activer les plugins correspondants, générer vos inventaires et tester la connectivité aux hôtes.
Plugin libvirt
Le plugin libvirt permet d’inventorier les machines virtuelles gérées par QEMU/KVM via libvirt.
-
Créez un fichier
libvirt.yml
:plugin: community.libvirt.libvirturi: 'qemu:///system' -
Ajoutez la configuration dans
ansible.cfg
:[defaults]inventory = libvirt.ymlinterpreter_python = auto_silent[inventory]enable_plugins = community.libvirt.libvirt, auto, yaml, ini, script -
Installez les dépendances :
Terminal window ansible-galaxy collection install community.libvirtpip install libvirt-python -
Testez l’inventaire :
Terminal window ansible-inventory --graph --varsVous devriez voir les VMs listées avec leurs variables.
Plugin AWS EC2
Le plugin aws_ec2 permet d’inventorier automatiquement vos instances EC2.
-
Créez un fichier
aws_ec2.yml
:plugin: amazon.aws.aws_ec2regions:- us-east-1keyed_groups:- key: tags.Nameprefix: tag_Name_separator: "" -
Configurez
ansible.cfg
:[defaults]inventory = aws_ec2.yml[inventory]enable_plugins = amazon.aws.aws_ec2, auto, ini, yaml, script -
Installez les dépendances :
Terminal window ansible-galaxy collection install amazon.awspip install boto3 botocore -
Exécutez l’inventaire :
Terminal window ansible-inventory --graphLes instances EC2 sont organisées en groupes selon leurs tags.
Vous avez un exemple complet dans ce billet de blog
Plugin Incus
Le plugin Incus permet d’inventorier les conteneurs gérés par Incus.
-
Créez le fichier
incus.yml
:---plugin: kmpm.incus.incusgroupby:debian:type: osattribute: Debianweb:type: patternattribute: '^web'db:type: patternattribute: '^db' -
Ajoutez la configuration dans
ansible.cfg
:[defaults]inventory = incus.yml[inventory]enable_plugins = kmpm.incus.incus, auto, yaml, ini, script -
Installez les dépendances :
Terminal window ansible-galaxy collection install git+https://github.com/kmpm/ansible-collection-incus.git -
Exécutez l’inventaire :
Terminal window ansible-inventory --graph
Les instances Incus sont organisées en groupes selon leurs patterns définis
dans le fichier incus.yml
.
Utilisation de Scripts pour Générer des Inventaires Dynamiques
En plus des plugins fournis par Ansible, il est possible de créer ses propres scripts d’inventaire dynamique. Cette approche offre une souplesse totale pour intégrer des sources de données personnalisées : bases SQL, API internes, fichiers métiers, etc.
Un script d’inventaire dynamique est un programme (souvent en Python) qui, lorsqu’il est exécuté par Ansible, retourne un inventaire complet au format JSON conforme aux attentes du moteur d’exécution d’Ansible.
Pourquoi utiliser un script ?
Les scripts sont utiles lorsque :
- Il n’existe aucun plugin officiel pour votre environnement,
- Vous avez besoin de traitements spécifiques (filtres métier, enrichissements…),
- Vous souhaitez interroger une source de données interne ou propriétaire (base SQL, fichier YAML, application métier…).
Structure minimale d’un script
Un script d’inventaire doit :
- être exécutable (
chmod +x
), - accepter une option
--list
(ou ne rien prendre du tout), - afficher un dictionnaire JSON avec les groupes, hôtes, et variables dans le format Ansible attendu.
Voici un exemple minimaliste de script en Python :
#!/usr/bin/env python3import json
inventory = { "all": { "hosts": ["web1", "web2"] }, "_meta": { "hostvars": { "web1": { "ansible_host": "192.168.1.10" }, "web2": { "ansible_host": "192.168.1.11" } } }}
print(json.dumps(inventory, indent=2))
Enregistrez ce script sous le nom my_inventory.py
.
Exemple avancé avec base PostgreSQL
Voici un exemple réel qui interroge une base PostgreSQL pour générer dynamiquement l’inventaire :
#!/usr/bin/env python3import psycopg2import json
conn = psycopg2.connect( host="db.local", dbname="infra", user="ansible", password="secret")cur = conn.cursor()cur.execute("SELECT hostname, ip, group_name FROM hosts")rows = cur.fetchall()
inventory = {"_meta": {"hostvars": {}}}groups = {}
for hostname, ip, group in rows: groups.setdefault(group, []).append(hostname) inventory["_meta"]["hostvars"][hostname] = {"ansible_host": ip}
for group, hosts in groups.items(): inventory[group] = {"hosts": hosts}
inventory["all"] = {"children": list(groups.keys())}print(json.dumps(inventory, indent=2))
Ce script génère un inventaire dynamique basé sur les données d’une base SQL. Il peut être exécuté avec :
ansible-inventory -i ./script.py --listansible-playbook -i ./script.py playbook.yml
Bonnes pratiques
- Validez le format de sortie JSON avec
ansible-inventory --list
. - Protégez vos identifiants : ne les mettez jamais en clair (utilisez un
fichier
.env
, Vault, ou des variables d’environnement). - Rendez votre script rapide : évitez les requêtes ou traitements coûteux.
- Documentez bien votre script, surtout s’il est partagé dans une équipe.
Scripts communautaires
Ansible met à disposition plusieurs scripts d’exemple dans le dépôt suivant : 🔗 https://github.com/ansible-community/contrib-scripts/tree/main/inventory ↗
On y retrouve :
- des scripts pour Vagrant, Rudder, FreeIPA, Scaleway,
- des modèles simples en Bash et Python,
- des bases pour écrire vos propres connecteurs dynamiques.
Exercices pratiques : Utiliser un inventaire dynamique avec Ansible
Vous avez maintenant une bonne compréhension des inventaires dynamiques dans Ansible : leur principe, les plugins disponibles, et l’utilisation de scripts pour générer automatiquement des hôtes. Passons à l’étape suivante : pratiquer en situation réelle.
Dans cette série de TP, vous allez configurer différents types d’inventaires dynamiques, interroger des environnements virtuels (incus) et observer comment Ansible intègre automatiquement ces hôtes dans sa structure d’exécution.
👉 Travaux pratiques : TP 5 : Inventaires dynamiques Ansible ↗
Ces exercices couvrent notamment :
- La découverte d’hôtes via le plugin
incus
- La configuration de fichiers
ansible.cfg
adaptés aux environnements dynamiques - L’exécution de
ansible-inventory --graph
et--list
pour visualiser dynamiquement la structure - La connexion aux hôtes découverts avec
ansible -m ping
Pourquoi pratiquer ?
Apprendre à utiliser un inventaire dynamique vous permettra de :
- Automatiser des déploiements sans avoir à maintenir manuellement vos fichiers d’inventaire
- Réagir aux changements d’infrastructure (ajout ou suppression d’instances)
- Développer des scripts d’intégration sur mesure avec vos sources de données
- Vous préparer à des environnements cloud-native, évolutifs ou conteneurisés
Cloner le dépôt ou suivre les consignes en ligne vous permettra de maîtriser les fondamentaux des inventaires dynamiques Ansible, et d’aborder avec confiance l’automatisation de votre infrastructure à grande échelle.
Contrôle de connaissances : Inventaires statiques Ansible
Pourquoi ce contrôle ?
Cet contrôle va vous permettre de valider vos connaissances sur le sujet abordé dans le guide. Il comporte des QCM, des questions vrai/faux et des réponses ouvertes à un mot.
🕒 Le chronomètre commence dès que vous cliquez sur Démarrer le test. Vous devrez terminer l’examen avant la fin du temps imparti.
🎯 Pour réussir, vous devez obtenir au moins 80% de bonnes réponses.
💡 Je ne fournis pas directement les réponses aux questions. Cependant, si certaines sont complexes, des pistes d’explication pourront être proposées dans le guide ou après l’examen.
Bonne chance ! 🚀
Conclusion
Conclusion
Les inventaires dynamiques dans Ansible permettent d’adapter automatiquement l’inventaire aux changements de l’infrastructure, en interrogeant des sources externes (cloud, hyperviseur, supervision…). Contrairement aux inventaires statiques, ils évitent les mises à jour manuelles et sont particulièrement utiles dans des environnements cloud, virtualisés ou dynamiques.
Grâce aux plugins d’inventaire ou à des scripts personnalisés, Ansible peut générer en temps réel la liste des hôtes et leurs variables. Cela en fait un outil indispensable pour automatiser une infrastructure moderne de manière souple, fiable et à jour.