Inventaires : notions avancées
Objectifs du chapitre et prérequis
1. Contexte et prérequis
Ce chapitre va être consacré à plusieurs thématiques autour de l’inventaire. Vous verrez notamment comment stocker des données sensibles (identifiants et mots de passe) dans un fichier ainsi que la notion d’inventaire dynamique d’Ansible.
Au niveau des inventaires dynamiques, vous verrez quelques applications sur des produits du marché que vous pourriez rencontrer. Vous n’avez sûrement pas envie de réécrire un inventaire pour Ansible et de le maintenir alors que cette information est déjà disponible quelque part (et que vous y avez déjà consacré un temps précieux).
Les exemples traités dans ce chapitre partent du principe que vous disposez de droits d’administration sur vos machines.
Pour la partie sur l’écriture d’inventaire dynamique, vous aurez besoin de quelques notions en programmation Python.
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-04.tar.gz depuis la page Informations générales.
Chiffrement de fichiers
1. Contexte
Dans le chapitre de la découverte de l’inventaire, vous avez vu comment gérer ce dernier et stocker des identifiants ou des mots de passe. Petit problème, ces données sont stockées dans des fichiers plats. Quiconque ayant accès à vos inventaires pourrait en extraire des informations et s’en servir.
Dans ce qui va suivre, vous verrez un mécanisme qui permet de chiffrer vos fichiers afin d’éviter que des mots de passe en clair soient directement accessibles.
Tous les exemples qui vont suivre utiliseront le mot de passe « ansible ».
2. Stockage d’identifiants de connexion
La première étape va être de créer un fichier dans lequel vous allez stocker des informations de connexion à une base de données MySQL. Vous utiliserez pour cela deux champs : intranet_mysql_db_user et intranet_mysql_db_password.
Ces deux identifiants vous serviront pour une hypothétique application intranet.
Ci-dessous, la déclaration que vous utiliserez comme exemple pour la suite :
intranet_mysql_db_user: "intranet"
intranet_mysql_db_password: "1ntran3t!"
3. Chiffrement du fichier entier
Le chiffrement d’éléments dans Ansible se fait à l’aide de l’outil ansible-vault. Ce dernier peut fonctionner avec un mot de passe ou en passant des fichiers en argument.
Dans les deux cas, pour le chiffrement d’un fichier entier, il faut lancer ansible-vault avec l’option encrypt (chiffrer en anglais) suivie du nom de fichier.
Ansible peut utiliser des fichiers chiffrés pour tous les fichiers qu’il manipule. Vous...
Les inventaires dynamiques
1. Contexte
Vous êtes administrateur système/réseau et vous avez un parc de plusieurs centaines de machines. Vous devez donc déjà disposer de produits pour gérer vos machines.
Dans un premier réflexe, vous pourriez très bien faire une extraction régulière de votre parc à l’aide de vos propres scripts (shell, Python ou autre). Vous allez voir que ce n’est pas forcément nécessaire et que, généralement, il est tout à fait possible d’obtenir cette information directement à la source. Ci-dessous quelques exemples de ce que vous pourriez utiliser :
-
Vous supervisez votre parc à l’aide de Nagios, Shinken ou d’une autre solution, comme par exemple Zabbix.
-
Vous virtualisez votre infrastructure à l’aide de VMware.
-
Vous utilisez des machines dans le cloud (AWS, Azure ou autre).
-
Vous administrez des conteneurs de type Docker (Kubernetes ou Docker Swarm).
Si vous tombez sur un de ces cas, vous avez de grandes chances de pouvoir réutiliser ces informations directement via un plugin existant. Si ce n’est pas le cas, ce livre vous indiquera comment récupérer ces informations à l’aide d’un script d’inventaire spécifique.
À noter que les mécanismes présentés ici sont une introduction à la notion d’inventaire générique et ne sont pas supportées par la communauté. Une mise en place plus réaliste sera abordée un peu plus loin à la section Fonctionnement des plugins d’inventaires génériques.
2. Machines AWS
a. Prérequis...
Fonctionnement des plugins d’inventaires génériques
1. Contexte
Précédemment, le lecteur a abordé plusieurs façons de fournir à Ansible une liste de machines avec lesquelles travailler :
-
Par l’intermédiaire de fichiers textes (INI ou YAML)
-
Par l’intermédiaire de scripts générateurs d’inventaires au format YAML
En réalité, tous ces mécanismes font appel à un seul mécanisme interne à Ansible : les plugins d’inventaire.
Dans ce qui va suivre, le lecteur se familiarisera avec ce fonctionnement. Il abordera également la création d’un script d’inventaire dans le cas où l’existant ne conviendrait pas.
À noter que par défaut, Ansible supporte déjà un certain nombre de scripts (par ordre de priorité) :
-
host_list : machines passées en ligne de commande séparées par des virgules (exemple : -i host1,host2,host3).
-
script : script d’inventaire exécutable (exemple vu précédemment).
-
auto : format d’inventaire basé sur des fichiers au format YAML contenant une clé plugin (disponible depuis la version 2.5 d’Ansible).
-
yaml : format d’inventaire au format YAML (vu précédemment).
-
ini : format d’inventaire historique au format INI (vu précédemment).
-
toml : format d’inventaire au format TOML.
Le format TOML est un mélange entre le format INI et JSON/YAML. Il ne sera pas abordé dans ce livre.
La liste des formats supportés se configure à l’aide de la variable d’environnement...
Écrire son propre inventaire dynamique
1. Contexte
Vous avez fait le tour des plugins existants et rien ne correspond à votre cas. Autre possibilité, vous avez trouvé un plugin intéressant, mais vous avez besoin d’adapter certains aspects.
Ce chapitre va aborder l’écriture d’un plugin d’inventaire. L’ancien mécanisme s’appuyait sur la sortie d’une structure au format JSON. Même si rien n’empêche de continuer à utiliser cette solution, l’exemple qui sera abordé par la suite s’appuiera sur le nouveau mécanisme d’inventaire. Vous aborderez les éléments qui doivent s’y trouver et l’application à un cas concret.
2. Format en entrée
Dans l’exemple que vous aborderez, vous partirez d’un fichier properties Java que vous analyserez avant de le redonner à Ansible afin qu’il puisse s’en servir comme inventaire.
La structure de ce fichier de properties est connue. Vous y trouverez les clés suivantes :
-
db.host : nom de la machine de base de données.
-
db.user : utilisateur de la base de données.
-
db.password : mot de passe de l’utilisateur de la base de données.
-
apache.hosts : liste des machines apache séparées par des virgules (,).
Ci-dessous le fichier prop2inv.properties qui sera utilisé par la suite :
db.host=mysql1
db.user=test
db.password=password_test
apache.hosts=apache1,apache2
3. Structure du programme
Anciennement, le programme en lui-même pouvait être écrit dans n’importe quel langage. Dorénavant, avec le mécanisme...