Contactez-nous

Inventaire (Inventory) : décrire votre infrastructure

Découvrez comment l'inventaire Ansible vous permet de définir et d'organiser les machines (noeuds gérés) de votre infrastructure. Maîtrisez ce composant essentiel pour cibler efficacement vos playbooks et commandes Ad-Hoc.

L'inventaire Ansible : la carte de votre royaume automatisé

Au coeur de toute opération Ansible se trouve l'inventaire. C'est un fichier, ou un ensemble de fichiers, qui décrit l'infrastructure que vous souhaitez gérer. Il s'agit essentiellement d'une liste des noeuds gérés (serveurs, équipements réseau, etc.) qu'Ansible peut contacter et administrer. Sans inventaire, Ansible ne saurait pas sur quelles machines appliquer vos playbooks ou vos commandes Ad-Hoc. Comprendre la structure et les possibilités de l'inventaire est donc une étape cruciale pour utiliser Ansible efficacement.

L'inventaire ne se contente pas de lister des adresses IP ou des noms d'hôtes. Il permet également d'organiser ces noeuds en groupes logiques, de définir des variables spécifiques à certains hôtes ou groupes, et même d'imbriquer des groupes pour créer des hiérarchies complexes. Cette flexibilité est essentielle pour cibler précisément vos actions d'automatisation et pour adapter les configurations en fonction des rôles ou des environnements de vos machines.

Ansible supporte plusieurs formats pour les fichiers d'inventaire, les plus courants étant le format INI et le format YAML. Le format INI est souvent plus simple pour les inventaires de petite taille, tandis que le YAML offre plus de flexibilité pour les structures complexes et la définition de variables. Par défaut, Ansible recherche un fichier d'inventaire nommé `hosts` dans le répertoire `/etc/ansible/` ou un fichier `inventory` dans le répertoire courant du projet, mais vous pouvez spécifier un fichier d'inventaire différent à l'aide de l'option `-i` en ligne de commande. Il est aussi possible d'utiliser des inventaires dynamiques, générés à la volée par des scripts qui interrogent des sources externes comme des plateformes de cloud (AWS, Azure, GCP) ou des systèmes de CMDB (Configuration Management Database).

Structure et syntaxe d'un inventaire : du simple listing à l'organisation avancée

La forme la plus simple d'un inventaire est une liste de noms d'hôtes ou d'adresses IP, chacun sur une nouvelle ligne. Par exemple, dans un fichier au format INI :

mail.example.com
192.168.1.100
192.168.1.101

Pour une meilleure organisation, vous pouvez regrouper les hôtes sous des en-têtes de groupe, délimités par des crochets `[]` :

[webservers]
www1.example.com
www2.example.com

[dbservers]
db1.example.com

[datacentre1:children]
webservers
dbservers

Dans cet exemple, `webservers` et `dbservers` sont des groupes. Le groupe `datacentre1` est un méta-groupe qui inclut tous les membres des groupes `webservers` et `dbservers` grâce à la directive `:children`. Il est également possible de définir des alias pour les hôtes et des variables spécifiques directement dans l'inventaire. Par exemple, pour spécifier un port SSH non standard ou un utilisateur de connexion différent pour un hôte particulier :

badwolf ansible_host=192.168.4.42 ansible_port=2222 ansible_user=rose

[webservers]
www1.example.com ansible_user=tyler
www2.example.com

Ici, `badwolf` est un alias pour l'hôte `192.168.4.42`. Les variables comme `ansible_host`, `ansible_port`, `ansible_user`, `ansible_ssh_private_key_file` sont des variables de connexion Ansible bien connues. Vous pouvez également définir des variables personnalisées qui seront disponibles pour vos playbooks :

[webservers]
www1.example.com http_port=80 app_version=1.2
www2.example.com http_port=8080 app_version=1.3

[webservers:vars]
ntp_server=ntp.example.com
deploy_env=production

Les variables peuvent être associées à des hôtes individuels (variables d'hôte) ou à des groupes entiers (variables de groupe, définies dans une section `[group_name:vars]`). La compréhension de la portée et de la précédence des variables est un aspect important de la maîtrise d'Ansible, car elles permettent de rendre les playbooks génériques et réutilisables dans différents contextes.

Inventaires dynamiques et gestion avancée

Pour les environnements où le nombre de serveurs fluctue constamment, comme les infrastructures cloud, ou lorsque les informations sur les hôtes sont déjà gérées dans un système externe (CMDB, outil de virtualisation), la maintenance d'un fichier d'inventaire statique peut devenir fastidieuse et source d'erreurs. C'est là quinterviennent les inventaires dynamiques.

Un inventaire dynamique est un script exécutable (en Python, Bash, Perl, etc.) ou un plugin Ansible qui récupère les informations sur l'infrastructure à partir d'une source de vérité externe et les formate en JSON pour qu'Ansible puisse les consommer. Ansible est fourni avec des scripts d'inventaire pour les principaux fournisseurs de cloud (AWS EC2, Google Compute Engine, Azure, OpenStack, etc.) et d'autres systèmes. Ces scripts interrogent les API correspondantes pour lister les instances, leurs adresses IP, leurs tags, et d'autres métadonnées pertinentes, qui peuvent ensuite être utilisées pour créer dynamiquement des groupes et assigner des variables.

Par exemple, un script d'inventaire pour AWS EC2 pourrait automatiquement regrouper les instances en fonction de leurs tags AWS, de leur type, de leur région ou de leur VPC. Cela permet à vos playbooks de cibler des ensembles d'instances de manière très flexible sans avoir à mettre à jour manuellement un fichier d'inventaire chaque fois qu'une instance est créée ou supprimée.

La configuration des inventaires dynamiques peut nécessiter l'installation de bibliothèques Python spécifiques (comme `boto3` pour AWS) et la configuration des identifiants d'accès à l'API. Ansible permet également de combiner plusieurs sources d'inventaire (statiques et dynamiques) dans un même projet. La gestion de l'inventaire est une compétence clé : un inventaire bien structuré et maintenu est le fondement d'une automatisation efficace et évolutive avec Ansible.