Découverte d'Ansible Event Driven
Annoncé à l’ansibleFest 2022, ansible-rulebook
apporte à Ansible la
possibilité de déclencher des actions à partir d’un événement. En effet, jusqu’à
maintenant déclencher des playbooks Ansible suite à la survenue d’un événement
nous demandait d’écrire et de faire tourner régulièrement des jobs charger de
les collecter et de déclencher les traitements adéquats.
Pour rappel, une des tâches qui nous incombent est de chercher à automatiser un
maximum de tache sans valeurs ajoutées. Par exemple, on devrait ne pas
intervenir sur des incidents simples
ou la correction est connue, ou traiter
de simples demandes en provenance de nos clients. Je suis sûr que comme
moi, vous aimeriez pouvoir vous concentrer sur d’autres tâches à plus fortes
valeurs ajoutées que de traiter des tickets en série. Par exemple, pour ce qui
est du traitement des incidents, à défaut de pouvoir les résoudre
automatiquement, nous devrions au moins pouvoir automatiser la collecte des
informations nécessaires à l’identification de leurs causes premières.
Voyons ensemble comment fonctionne ce nouvel outil Ansible : ansible-rulebook
.
Ansible-rulebook
Commençons par l’installer :
Installation d’ansible-rulebook
Pour tester cet outil, comme d’habitude, je le fais en utilisant une VM popé sur mon poste de travail avec Vagrant :
Maintenant en parcourant la documentation, nous voyons qu’il existe deux manières de l’installer : une avec Ansible et une manuelle, je vais prendre la seconde solution, car j’aime bien savoir ce qu’il se passe :
Voilà tout est prêt. Passons à l’écriture de nos premiers rulebooks
:
Ecriture des rulebooks
La documentation ↗ est déjà disponible.
Un exemple de rulebook
:
Ansible donc yaml
. J’en connais qui vont râler. Mais pour ceux qui codent des
playbooks Ansible, la syntaxe sera simple à prendre en main.
Nous retrouvons trois sections : hosts
, sources
et rules
. sources
permet
de définir d’où provient l’événement et rules
pour les traitements à lancer.
Pour qu’une action soit lancée, elle doit répondre à une condition de type
booléen. Ces conditions sont les mêmes que celles que nous utilisons dans nos
conditions when
.
Dans l’exemple ci-dessus la source utilise un range python
qui compte de 0 à
5. La règle définit une action qui se déclenche sur l’événement i==1
, ici le
lancement d’un playbook : ansible.eda.hello
Pour lancer l’exécution du rulebook, il faut définir un inventaire :
Ici localhost
avec la connexion de type local
. On a tout ce qu’il faut pour
lancer le rulebook 👍:
Cela a produit le résultat attendu. Passons à un autre exemple avec l’utilisation d’un webhook.
La source est cette fois un webhook
qui écoute sur le port 5000. Pour que
l’exemple fonctionne, il faut installer au préalable le package python aiohttp
.
On peut lancer ansible-rulebook
:
Contrairement à tout à l’heure, ansible-rulebook
attend un événement. Lançons
cet évènement depuis un autre terminal :
Que s’est-il passé dans l’autre terminal. On peut y lire ceci 👍
Le traitement s’est lancé et ansible-rulebook
attend à nouveau des événements à
traiter. Lançons d’autres tests en changeant le contenu du message.
On peut aussi trouver un exemple sur le dépôt du projet
ansible-rulebook ↗ dans le
répertoire demo
.
Dans l’autre terminal juste une ligne apparaît avec aucune trace d’un traitement lancé :
Passage de variables
Comment récupérez des variables et les transmettre aux playbooks? Les facts ?
Une des réponses, je l’ai trouvé en utilisant l’action debug
. Remplaçons notre
action dans l’exemple précédent (d’ailleurs, on ne peut en mettre qu’une seule).
Si on relance modifiant notre appel curl avec ajout d’un champ :
On voit
Donc essayons d’afficher un des champs de variables dans l’action debug :
On voit dans la sortie apparaitre notre variable :
Donc maintenant pour l’ajouter invoque un playbook avec un argument :
Dans ce playbook, je demande à afficher simplement hostvars :
Dans les hostvars, je relance et bingo, fact est transmis pas besoin de se prendre la tête. Je modifie et je teste directement fact.
Différents types types de sources
Si on étudie la documentation, on voit que pour le moment ansible-rulebook
propose des plugins par défaut. Qui dit plugin dit possibilité d’en coder soit
même.
Parmi ceux fournis :
alertmanager
: traiter des événements via un webhook en provenance d’alertmanagerazure_service_bus
- traiter des événements d’un service Azurefile
- charge les facts à partir de fichiers YAML et recharge lorsqu’un fichier change ?kafka
- traiter des événements d’un stream kafkarange
- un range pythontick
- un index croissant i illimitéurl_check
- interroge un ensemble d’URL et envoie des événements avec leurs statutswatchdog
- surveille le système de fichiers et envoie des événements lorsqu’un statut d’un fichier changenone
- vu dans l’exemple ci-dessus
D’autres types d’actions
run_module
- lancement d’un simple module Ansiblerun_playbook
- lancement d’un playbook via ansible-runnerset_fact
- définir des factsretract_fact
- efface un factspost_event
- envoie d’autres événements pour enchainer des traitementsdebug
- affiche l’événement et ses facts avec ses argumentsprint_event
- affiche l’événementnoop
- ne fais rienshutdown
- arrête ansible-rulebook
Ils sont tous documentés ici ↗
Plus loin avec ansible-rulebook
J’imagine déjà plein de cas d’usage pour cet outil, comme :
- lancer et enchainer des playbooks sur des machines qui viennent d’être créé sur notre infrastructure. J’imagine simplifier pas mal certains playbooks enchaînant des tas de roles et tasks en les découpant.
- traiter des demandes clientes depuis notre outil de ticketing ou des appels via curl (mais quid de la partie droit ?)
- et bien traiter des incidents bien identifiés.
- traiter le patch management avec reprise auto des erreurs connues.
- …
Mauvaise nouvelle, pour le moment l’extension vscode ansible ne prend pas en charge ce type de fichier.
Mais je vais approfondir longuement ce nouvel outil.