Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Ansible
  3. Découverte de l’inventaire
Extrait - Ansible Gérez la configuration de vos serveurs et le déploiement de vos applications (3e édition)
Extraits du livre
Ansible Gérez la configuration de vos serveurs et le déploiement de vos applications (3e édition)
2 avis
Revenir à la page d'achat du livre

Découverte de l’inventaire

Objectifs du chapitre et prérequis

Dans le chapitre précédent, vous avez vu comment installer Ansible et lancer quelques commandes sur la machine locale. Vous allez voir maintenant comment adresser vos requêtes à différentes machines et profiter de la capacité de lancement en parallèle d’Ansible pour l’exécution de vos opérations.

1. Contexte et prérequis

Les exemples traités dans ce chapitre partent du principe que :

  • vous disposez de machines Linux sur lesquelles vous avez effectué vos échanges de clés SSH (cf. chapitre Démarrer avec Ansible) ;

  • vous disposez de droits root sur vos machines.

2. Fichiers téléchargeables

Vous pouvez récupérer les exemples des répertoires inventaires et variables sur le repository GitHub suivant : https://github.com/EditionsENI/ansible

Vous pouvez également récupérer ces fichiers dans l’archive chapitre-03.tar.gz depuis la page Informations générales.

Structure d’un inventaire

L’inventaire sous Ansible est un fichier au format INI. La déclaration d’un groupe se fait en utilisant le nom du groupe entre crochets. Les machines rattachées à ce groupe sont simplement ajoutées à la suite de la déclaration du groupe (une machine par ligne).

Prenez un exemple avec les éléments suivants :

  • Un groupe apache constitué de la machine rec-apache-1.

  • Un groupe mysql avec la machine rec-mysql-1.

Ci-dessous un fichier d’inventaire correspondant à cette déclaration :

[apache] 
rec-apache-1 
 
[mysql] 
rec-mysql-1 

À noter qu’il est également possible de stocker cette déclaration sous la forme d’un fichier YAML. Dans ce cas, la déclaration prendra la forme suivante :

apache: 
  hosts: 
    rec-apache-1: {} 
 
mysql: 
  hosts: 
    rec-mysql-1: {} 

Par la suite, ce fichier sera référencé sous le nom de fichier host ou fichier d’inventaire. Il sera accessible sous le nom de recette.inv (au format INI) ou recette.yml (format YAML).

Pour y faire appel, il faudra passer l’option -i à ansible avec le nom du fichier. 

 Afin de vérifier que la communication avec les machines distantes se passe bien, vous allez appeler ansible avec le module ping (en passant le nom du module avec l’option -m).

Ci-dessous un exemple d’appel avec l’inventaire YAML :

$ ansible -i recette.yml -m ping all 

Si tout se passe bien, Ansible devrait renvoyer le résultat suivant :

rec-mysql-1 | SUCCESS...

Fusion d’inventaires

Ansible est en mesure de fusionner plusieurs fichiers d’inventaires qui se trouvent dans le même répertoire. Le problème de cette technique est qu’il n’est pas possible de maîtriser les fichiers qui sont passés en paramètre à Ansible à moins de recopier temporairement les fichiers dans un répertoire de travail. Le problème est le même dans le cas où les fichiers se trouvent dans plusieurs répertoires différents.

Les versions récentes d’Ansible permettent de cumuler en ligne de commande la liste des inventaires. Ainsi, plutôt que de passer un chemin où sont stockés l’ensemble des fichiers d’inventaires, il devient possible de les passer un à un en répétant l’utilisation de l’option --inventory (ou -i).

Ainsi, pour lancer le module ping sur l’ensemble des machines des fichiers d’inventaires recette.yml et production.yml, la commande à lancer prendra la forme suivante :

$ ansible -m debug -i recette.yml -i production.yml all 

Ci-dessous le résultat de cette commande :

prod-haproxy | SUCCESS => { 
    "msg": "Hello world!" 
} 
... 
active-directory-1 | SUCCESS => { 
    "msg": "Hello world!" 
} 
container-1 | SUCCESS => { 
    "msg": "Hello world!" 
}