Développer et utiliser les lookup Ansible
Les lookups Ansible permet de récupérer des données qui sont stockées sur le noeud ou est exécuté le playbook. Par exemple il est possible de lire le contenu d’un fichier, de générer un mot de passe aléatoire, etc.
Les lookup Ansible disponibles
Il existe beaucoup de lookup disponible via la communauté ansible.
Nous allons nous intéresser à quelques lookup dont ceux qui sont intégrés par défaut à Ansible et à ceux de la communauté Général. Vous pouvez retrouver la liste de tous les lookups installés sur votre noeud via la commande suivante :
Lire des variables d’environnement
On utilise ici le lookup env
:
Pour lancer ce playbook (et tous les autres exemples) il suffit de taper la commande suivante :
On ne le lance que sur localhost via une connexion locale.
Ce qui donne :
Lire le retour d’une commande
Il est possible de récupérer la sortie d’une commande avec le lookup pipe :
Ce qui donne :
Lire le contenu d’un fichier
Pour lire le contenu d’un fichier, vous devez utiliser le lookup file. Rappel le fichier est stocké sur le noeud où est lancé le playbook. Donc pour notre test créer un fichier test.txt ou se trouve votre playbook :
Ce qui donne :
Générer un mot de passe
Cette fois , nousallons utiliser le lookup Ansible password.
Ce qui donne :
Vous devriez retrouver le fichier password.secret dans le répertoire ou vous
exécuter le playbook. Si vous ne voulez pas le stocker il suffit d’indiquer /dev/null
.
Il est possible de formater le mot de passe en utilisant les paramètres suivant accolés au nom de fichier :
- chars : vous pouvez indiquer les attributs du module string de python : ascii_letters, digits, hexdigits, punctuation ou votre propre liste de caractères.
- length: la taille de votre mot de passe
- encrypt: la méthode d’encryptage parmi :
passlib.hash; md5_crypt, bcrypt, sha256_crypt, sha512_crypt
. Par défaut, il s’agit du format plain_text sinon le fichier contiendra également le salt pour l’idem potence.
Exemple, on génère un mot de passe de 64 caractères intégrant des chiffres, des lettres et les caractères .-! :
Ce qui donne :
Lire une entrée DNS
Nous allons utiliser ici le lookup dig qui est très complet, mais il faut installer le module python dnspython:
Ce qui donne :
Ce lookup utilise deux paramètres :
- flat: 0 ou 1 qui indique si l’on souhaite un export plat ou un dictionnaire
- qtype: le type de requête Un exemple les utilisant :
Ce qui donne:
Les autres filtres
Comme dis plus haut il existe un tas de lookup disponible dont voici la liste complète ↗.
Avant de vous lancer dans le développement de votre propre lookup vérifier qu’il n’existe pas.
Développer un lookup Ansible
Nous allons écrire notre propre plugin lookup qui retournera la version d’Ansible.
Dans le répertoire créer le fichier ansible_version.py avec ce contenu :
Maintenant appelons le depuis un playbook:
Ce qui donne :
Quelques explications
On retrouve une classe LookupModule qui hérite de la classe LookupBase. Cette classe doit implémenter la méthode run.
La variable contient les arguments passés au module lookup sous la forme d’un tableau.
Comme pour le plugin filter il est possible de lever des exceptions:
Je suis sûr que vous avez déjà plein d’idées :)
Pour tester vos développements sur différentes versions d’Ansible et Python, je vous propose de lire ce billet.
Si vous voulez plus de tutorial Ansible je vous renvoie sur le billet de l’introduction à ansible