Sortie Ansible et centralisation
Objectifs du chapitre et prérequis
1. Contexte et prérequis
Jusqu’à maintenant, vous avez toujours utilisé Ansible avec sa configuration par défaut pour l’affichage des résultats. Il faut savoir qu’il est tout à fait possible de personnaliser la sortie écran et d’envoyer ce résultat vers un mécanisme de centralisation (syslog, Elasticsearch, etc.).
Pour cela, vous allez découvrir les champs disponibles dans la configuration d’Ansible ainsi que le mécanisme des callbacks d’affichage. Vous verrez notamment un certain nombre de callbacks prêts à l’emploi : certains permettront d’avoir un résumé des temps d’exécution alors que d’autres centraliseront les résultats des exécutions. L’outil ARA (Ansible Run Analytics) sera également présenté afin de centraliser et restituer les exécutions de playbooks Ansible.
Dans le cas où les plugins existants ne suffiraient pas, vous aborderez l’écriture d’un plugin spécifique.
2. Fichiers téléchargeables
Vous pouvez récupérer des exemples de ce chapitre sur le repository GitHub suivant : https://github.com/EditionsENI/ansible
Vous pouvez également récupérer ces fichiers dans l’archive chapitre-11.tar.gz depuis la page Informations générales.
Gestion de la sortie standard d’Ansible
1. Contexte
Avant d’aborder le mécanisme des callbacks, vous allez voir ce qu’il est possible de faire au niveau de la sortie standard d’Ansible. Vous aborderez notamment les aspects suivants :
-
Ajout d’une touche de fantaisie dans la sortie avec l’utilisation de cowsay.
-
Gestion de la couleur dans la sortie standard.
2. Fichier de configuration et cowsay
Dans le cas où vous disposez du binaire cowsay sur la machine qui sert à lancer Ansible, ce dernier l’utilisera par défaut pour afficher les résultats des playbooks lancés.
Ci-dessous un petit exemple de trace que vous pourriez obtenir :
ok: [haproxy1]
_____________________________________________________________
< TASK [mediawiki/haproxy : enable and start haproxy service] >
-------------------------------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Il est possible de customiser le rendu en sortie de cowsay en utilisant un des nombreux skins. On passe pour cela par la variable ANSIBLE_COW_SELECTION. Ci-dessous, un exemple de résultat en utilisant le skin turkey (export ANSIBLE_COW_SELECTION=turkey) :
ok: [haproxy1]
_____________________________________________________________...
Gestion du callback d’affichage
1. Contexte
Vous avez vu le cas particulier de Cowsay et de la gestion des couleurs. Ansible est accompagné de nombreux callbacks d’affichage. Dans ce qui va suivre, vous allez voir comment en changer.
Comme pour Cowsay, il est possible de passer par le fichier de configuration ou une variable d’environnement :
-
champ stdout_callback dans le fichier de configuration ;
-
variable d’environnement ANSIBLE_STDOUT_CALLBACK.
Ces variables d’environnement ne sont pas forcément toutes très bien documentées. Pour en avoir la liste exhaustive, vous pouvez consulter le contenu du fichier constants.py à la racine des fichiers d’Ansible pour les versions 2.3.x et antérieures, ou config/data/config.yml pour les versions 2.4.x et supérieures.
Comme toujours, faites vos tests avec la variable d’environnement. Une fois que vous aurez trouvé la configuration qui vous sied, fixez-la avec un fichier de configuration.
2. Quelques plugins d’affichage alternatifs
Lors de l’exécution des tâches d’un playbook, chacune est indiquée avec le formalisme suivant :
-
Nom de la tâche lancée.
-
Une ligne pour chaque tâche lancée et pour chaque machine, un résultat de lancement.
-
Un résumé des opérations.
Il est possible de réduire la sortie en utilisant le plugin dense. Ce dernier n’affichera qu’une seule ligne du nom du playbook lancé suivie des opérations en cours de lancement.
Ci-dessous, un exemple de lancement lorsque vous exportez la variable ANSIBLE_STDOUT_CALLBACK=dense :
PLAY 1: APACHE INSTALLATION
task 3. apache1 apache2...
Centralisation des résultats d’exécution
1. Contexte
Dans le cas d’un déploiement initial d’Ansible vous n’aurez pas forcément besoin de centraliser les opérations lancées. En revanche, lorsque vous aurez plusieurs dizaines d’installations qui sont lancées sur plusieurs milliers de machines par une équipe de plusieurs dizaines de personnes, vous aurez peut-être envie d’avoir quelques indications sur ce qu’il se passe.
Là encore, Ansible propose plusieurs solutions par défaut. Vous en verrez deux qui permettent de centraliser simplement les choses :
-
Le callback syslog_json.
-
Le callback logstash.
Le callback Ara sera également abordé afin de découvrir une solution plus avancée.
Il s’agit là de suggestions. Il vous sera toujours possible de choisir autre chose. N’hésitez pas à chercher pour connaître les autres solutions disponibles, la communauté autour d’Ansible étant très active.
Dans le cas où vous n’auriez pas trouvé une solution qui convienne, il sera toujours possible d’écrire votre propre callback pour répondre à votre besoin.
2. Centralisation via Syslog
Une manière assez traditionnelle de centraliser des informations est de passer par le mécanisme de Syslog d’Unix. Par la suite, ce service sera rendu par rsyslog et il écoutera sur le port 514 en mode UDP.
Pour ouvrir la communication entre Ansible et Syslog, il vous faudra :
-
exporter la variable ANSIBLE_CALLBACK_WHITELIST avec pour valeur syslog_json ;
-
exporter la/les variable(s) SYSLOG_SERVER, SYSLOG_PORT...
Écriture de son propre callback d’affichage
1. Contexte
Vous avez fait le tour des solutions disponibles avec Ansible ainsi que dans la communauté, mais malheureusement vous n’avez pas trouvé de solution adaptée.
Vous allez donc procéder à l’écriture de votre propre callback. Pour l’essentiel, il s’agit d’écrire un programme en Python. Vous devrez donc, par conséquent, posséder quelques notions sur la programmation Python et sur l’utilisation des notions objets de ce langage.
2. Structure du programme
Avant de voir comment exposer le callback au niveau d’Ansible, vous allez découvrir la structure de ce petit programme.
En premier lieu, il vous faudra un en-tête Python avec l’emplacement de l’interpréteur et une indication sur l’encodage du fichier.
Ci-dessous, les deux lignes en question :
#!/usr/bin/python3
# -*- coding: utf-8 -*-
Afin de faire fonctionner les bibliothèques Ansible, vous aurez également besoin de faire quelques imports liés à la compatibilité Python 2 et 3.
Ci-dessous les déclarations à réaliser :
# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
Le callback doit déclarer une classe CallbackModule. Dans le même temps, elle doit hériter de la classe CallbackModule du package ansible.plugins.callback.default.
Afin de contourner ce problème, il vous faut importer CallbackModule et l’utiliser avec un nom différent (ex. : CallbackModule_default). L’instruction d’import permettant...