Aller au contenu

Les inventaires dynamiques Ansible

Mise à jour :

logo ansible

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 :

  1. Se connecte au service externe (API, hyperviseur, etc.),
  2. Récupère la liste des machines disponibles,
  3. Organise ces machines en groupes d’hôtes avec des variables,
  4. 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 :

PluginEnvironnement
amazon.aws.aws_ec2Amazon EC2
azure.azcollection.azure_rmMicrosoft Azure
google.cloud.gcp_computeGoogle Cloud Platform
community.docker.docker_containersConteneurs Docker
community.general.proxmoxProxmox VE
community.libvirt.libvirtlibvirt / KVM
community.zabbix.zabbix_inventoryZabbix
community.general.incusIncus
kubernetes.core.k8sKubernetes

Afficher la liste des plugins installés

Pour consulter tous les plugins d’inventaire disponibles dans votre environnement Ansible :

Terminal window
ansible-doc -t inventory -l

Extrait de sortie possible :

Terminal window
amazon.aws.aws_ec2 EC2 inventory source
community.docker.docker_container Docker inventory source
community.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 :

Terminal window
ansible-doc -t inventory <nom_du_plugin>

Par exemple :

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

  1. Créez un fichier libvirt.yml :

    plugin: community.libvirt.libvirt
    uri: 'qemu:///system'
  2. Ajoutez la configuration dans ansible.cfg :

    [defaults]
    inventory = libvirt.yml
    interpreter_python = auto_silent
    [inventory]
    enable_plugins = community.libvirt.libvirt, auto, yaml, ini, script
  3. Installez les dépendances :

    Terminal window
    ansible-galaxy collection install community.libvirt
    pip install libvirt-python
  4. Testez l’inventaire :

    Terminal window
    ansible-inventory --graph --vars

    Vous devriez voir les VMs listées avec leurs variables.

Plugin AWS EC2

Le plugin aws_ec2 permet d’inventorier automatiquement vos instances EC2.

  1. Créez un fichier aws_ec2.yml :

    plugin: amazon.aws.aws_ec2
    regions:
    - us-east-1
    keyed_groups:
    - key: tags.Name
    prefix: tag_Name_
    separator: ""
  2. Configurez ansible.cfg :

    [defaults]
    inventory = aws_ec2.yml
    [inventory]
    enable_plugins = amazon.aws.aws_ec2, auto, ini, yaml, script
  3. Installez les dépendances :

    Terminal window
    ansible-galaxy collection install amazon.aws
    pip install boto3 botocore
  4. Exécutez l’inventaire :

    Terminal window
    ansible-inventory --graph

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

  1. Créez le fichier incus.yml :

    ---
    plugin: kmpm.incus.incus
    groupby:
    debian:
    type: os
    attribute: Debian
    web:
    type: pattern
    attribute: '^web'
    db:
    type: pattern
    attribute: '^db'
  2. Ajoutez la configuration dans ansible.cfg :

    [defaults]
    inventory = incus.yml
    [inventory]
    enable_plugins = kmpm.incus.incus, auto, yaml, ini, script
  3. Installez les dépendances :

    Terminal window
    ansible-galaxy collection install git+https://github.com/kmpm/ansible-collection-incus.git
  4. 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 python3
import 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 python3
import psycopg2
import 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 :

Terminal window
ansible-inventory -i ./script.py --list
ansible-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.