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. Écriture de filtres Jinja et mécanisme de lookup
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

Écriture de filtres Jinja et mécanisme de lookup

Objectifs du chapitre et prérequis

1. Contexte et prérequis

Dans ce chapitre, vous allez revenir sur la notion de filtres. Vous reverrez les filtres importants livrés par défaut avec Ansible. Vous aborderez également l’écriture de filtres et leur utilisation dans la gestion des mots de passe.

Enfin, vous aborderez un autre type de plugin Ansible : le mécanisme de lookup

Ces deux types de plugin sont tous les deux écrits en Python et s’exécutent sur la machine envoyant les appels Ansible. La différence se fait sur la façon de les utiliser. Le premier s’applique sur des variables à l’aide d’un filtre Jinja. Le second peut s’utiliser dans la définition du contenu de variables, mais également pour définir des boucles (loop ou instructions du type with_*.

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-13.tar.gz depuis la page Informations générales.

Les filtres Jinja

1. Retour sur les filtres Jinja

Dans le chapitre introduisant la notion de rôle, vous avez abordé rapidement les filtres Jinja. Vous avez vu que vous étiez en mesure de réaliser certaines opérations, comme par exemple des conversions de chaînes de caractères (entiers, booléens ou chiffres à virgule).

Vous pouvez également vous en servir pour tout un tas d’autres opérations :

  • Calculer des sommes de hachage (md5, sha1, etc.).

  • Obtenir la valeur maximum ou minimum d’une liste.

  • Trier des listes.

  • Etc.

Un point important à retenir concernant les filtres est qu’ils sont lancés sur la machine Ansible. Chaque filtre est lancé dans le contexte associé à la machine sur laquelle vous êtes en train de travailler.

2. Quelques exemples d’utilisation des filtres Jinja

Avant d’aller plus loin et d’écrire vos propres filtres, vous allez revoir certains des filtres existants.

a. Comment tester un filtre ?

Première chose, il faut pouvoir tester facilement vos filtres. Pour cela, vous passerez par le mode ad hoc d’Ansible avec le module debug.

Vous donnerez à ce dernier l’option -a msg suivie de l’instruction Jinja à tester. Ainsi, si vous voulez tester la conversion de la chaîne 112 en entier, il suffira d’écrire l’instruction suivante :

$ ansible -m debug -a msg="{{'123'|int}}" localhost 

Ici, Ansible vous donnera le résultat suivant :

localhost | SUCCESS => {  
   "msg": "112"  
} 

b. Valeur par défaut

Commencez...

Test de comparaison de mots de passe salés

Vous avez fait le tour des filtres existants. Ces derniers devraient vous permettre de répondre à un certain nombre de problématiques. Dans le cas où vous n’auriez pas trouvé ce qui vous intéresse, il vous est toujours possible d’écrire un filtre spécifique.

1. Quelques mots sur le stockage des mots de passe

Un grand classique de l’administration système est de créer des utilisateurs systèmes. Ces utilisateurs peuvent avoir éventuellement un mot de passe associé. Ces mots de passe sont « salés ».

Ce terme désigne le fait de rajouter une séquence aléatoire en début de mot de passe et d’utiliser cette séquence supplémentaire pour générer la somme de hachage. 

Pourquoi réaliser cette opération ? Pour des raisons de sécurité. En effet, les algorithmes de type md5 ou sha1 sont stables et génèrent toujours la même somme pour une chaîne donnée. Cette propriété permet d’ailleurs la signature de fichiers.

Le problème de cette stabilité est que vous pouvez vous servir de tables de correspondance inverse pour obtenir le mot de passe en clair. Il s’agit des rainbow tables.

Un moyen simple de s’en convaincre est de prendre la somme md5 de la chaîne test (098f6bcd4621d373cade4e832627b4f6) et de l’entrer dans le moteur de recherche Google. Vous vous rendrez rapidement compte que cette somme a déjà été réalisée et que vous pouvez donc rapidement obtenir...

Génération de mot de passe

1. Origine du besoin

Dans ce qui va suivre, vous allez aborder une technique permettant de générer des mots de passe. Ces mots de passe devront respecter les conditions suivantes :

  • Compter plus de 12 caractères.

  • Contenir des chiffres, des majuscules et quelques signes de ponctuation.

  • Changer tous les mois.

Si vous devez changer le mot de passe tous les mois, vous aurez à modifier l’inventaire. Afin d’éviter d’avoir à le faire vous allez aborder une technique de génération de mots de passe pseudo-aléatoires.

Ces derniers doivent répondre à certains critères :

  • Ne pas changer d’un appel Ansible sur l’autre.

  • Être différents d’une plateforme à une autre.

  • Répondre aux contraintes de sécurité.

2. Principe de fonctionnement du générateur de mots de passe

Il est tout à fait possible de tirer un mot de passe pseudo-aléatoire et de s’assurer que ce dernier ne change pas d’un coup sur l’autre. Il suffit de s’appuyer sur une graine identique d’un appel à l’autre.

Néanmoins, la graine doit changer tous les mois. Vous vous appuierez donc sur deux éléments :

  • Le nom de la machine (inventory_hostname).

  • La date du mois (’%m’|strftime).

a. Écriture du générateur de mots de passe

 Partant de cette graine, vous allez ensuite procéder à un tirage aléatoire de 12 caractères. L’initialisation du générateur de mots de passe se fait avec la fonction seed de la bibliothèque random de Python....

Récupération d’informations (lookup/query)

1. Principe de fonctionnement

Vous avez vu comment fonctionnent les filtres Jinja et comment vous en servir dans Ansible. Vous allez maintenant voir comment réaliser des appels de type lookup/query. Vous verrez ensuite comment écrire vos propres lookups.

La différence de comportement entre les instructions lookup et query se fait sur le contenu renvoyé :

  • L’instruction lookup renvoie des chaînes de caractères.

  • L’instruction query permet de renvoyer des structures (tableaux, structures JSON, etc.).

Dans le cas d’une boucle (loop), privilégiez l’instruction query.

L’instruction query peut être remplacée par le raccourci q.

2. Présentation des lookups Ansible natifs

a. Lecture de fichiers : file

Le lookup file est assez simple. Il sert à lire le contenu d’un fichier et à le renvoyer sous la forme d’une chaîne de caractères. L’appel se fait au niveau Jinja avec la forme suivante :

lookup('file', 'nom-fichier') 

Prenez le cas du fichier test-lookup-pass.txt dont voici le contenu :

Contenu du fichier test-lookup-file.txt 

L’affichage du contenu de ce fichier avec Ansible en mode ad hoc se fait à l’aide de l’instruction suivante :

$ ansible -m debug \ 
  -a msg="{{ lookup('file', 'test-lookup-file.txt') }}" localhost 

Ci-dessous le résultat obtenu :

localhost | SUCCESS => {  
   "msg": "Contenu du fichier test-lookup-file.txt"  
} 

b. Récupération du résultat...

Écriture de son propre lookup : KeePass

1. Contexte

Vous avez vu avec Ansible comment utiliser le résultat d’un plugin de lookup dans une boucle. Malheureusement, vous ne trouverez pas toujours une solution prête à l’emploi et vous serez peut-être amené à écrire votre propre solution.

Vous allez prendre l’exemple suivant : récupérer des informations en provenance du logiciel KeePassX sous Linux.

2. Dépendance Python

Avant d’aller plus loin, il va falloir installer la bibliothèque pykeepass. Cette installation se fait à l’aide de la commande suivante :

$ pip3 install pykeepass 

3. Récupération du mot de passe

La récupération d’un mot de passe KeePass va se faire en deux étapes :

  • Ouverture de la base de données KeePass.

  • Recherche et renvoi du mot de passe de l’entrée.

Pour cela, vous aurez besoin de l’objet PyKeePass et de la bibliothèque pykeepass. Ci-dessous, l’instruction correspondant à cet import :

from pykeepass import PyKeePass 

L’ouverture de la base KeePass se fait à l’aide de l’instruction PyKeePass(nom_fichier, password=mot_de_passe). L’objet renvoyé sera affecté à la variable db.

La recherche de l’entrée correspondant à l’utilisateur se fait à l’aide de la méthode find_entries_by_username avec en paramètre le nom de l’utilisateur recherché.

Pour faciliter la mise au point et la lisibilité, le programme passera par une méthode get_passwords. Cette fonction prendra en paramètres les informations...