Aller au contenu
Infrastructure as Code medium

Les inventaires dynamiques Ansible

11 min de lecture

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.

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.

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.

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

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

Fenêtre de terminal
ansible-doc -t inventory -l

Extrait de sortie possible :

Fenêtre de terminal
amazon.aws.aws_ec2 EC2 inventory source
community.docker.docker_container Docker inventory source
community.zabbix.zabbix_inventory Zabbix inventory source

Pour chaque plugin, une documentation détaillée est disponible directement depuis la ligne de commande :

Fenêtre de terminal
ansible-doc -t inventory <nom_du_plugin>

Par exemple :

Fenêtre de terminal
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).

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.

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 :

    Fenêtre de terminal
    ansible-galaxy collection install community.libvirt
    pip install libvirt-python
  4. Testez l’inventaire :

    Fenêtre de terminal
    ansible-inventory --graph --vars

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

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 :

    Fenêtre de terminal
    ansible-galaxy collection install amazon.aws
    pip install boto3 botocore
  4. Exécutez l’inventaire :

    Fenêtre de terminal
    ansible-inventory --graph

    Les instances EC2 sont organisées en groupes selon leurs tags.

Vous avez un exemple complet dans ce billet de blog

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 :

    Fenêtre de terminal
    ansible-galaxy collection install git+https://github.com/kmpm/ansible-collection-incus.git
  4. Exécutez l’inventaire :

    Fenêtre de terminal
    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

Section intitulée « 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.

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…).

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.

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 :

Fenêtre de terminal
ansible-inventory -i ./script.py --list
ansible-playbook -i ./script.py playbook.yml
  • 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.

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

Section intitulée « 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

  • 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

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 dynamiques Ansible

Section intitulée « Contrôle de connaissances : Inventaires dynamiques Ansible »

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 minutes
Seuil : 80%

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

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.