Introduction
Les lookup d’Ansible sont des extensions puissantes qui permettent d’accéder à des données externes depuis vos playbooks. Ils vous permettent de récupérer des informations à partir de fichiers, de bases de données, d’API, de services web et bien plus encore. Cette fonction est utilisée dans les playbooks et les rôles pour intégrer des informations dynamiques. À travers cette article vous verrais différent exemple de lookup.
Structure d’un Lookup
Un lookup d’Ansible est composé de deux arguments principaux :
- Le type de lookup: Il s’agit du nom du plugin de lookup que vous souhaitez utiliser. Par exemple, file, vars, pipe, etc.
- L’argument du lookup: Il s’agit des données spécifiques que vous souhaitez récupérer. La syntaxe et le format de cet argument varient en fonction du type de lookup utilisé.
Exemples de Lookups
Voici quelques exemples de lookups couramment utilisés :
Récupérer le contenu d’un fichier:
name: Ajout d'une clé publique
authorized_key:
user: vagrant
key: "{{ lookup('file', item) }}"
with_first_found:
- /home/key/paul.pub
- /home/key/jack.pub
- /home/key/fred.pub
Exécuter un programme et récupérer sa sortie:
- name: Installer une clé publique par défaut
authorized_keys:
user: vagrant
key: "{{ lookup('pipe', pubkey_cmd) }}"
vars:
pubkey_cmd: ssh-keygen -y -f /.vagrant.d/insecure_private_key
Afficher une variable d’environnement:
- name: Afficher le shell courant
debug:
msg: "{{ lookup('env', 'SHELL') }}"
Générer un mot de passe aléatoire:
- name: Créer un utilisateur avec un mot de passe aléatoire dans un fichier toto
become: true
user:
name: deploy
password: "{{ lookup('password', 'toto.txt encrypt=sha512_crypt') }}"
Rendre un template avec des variables:
- name: Afficher un message à partir d'un template
debug:
msg: "{{ lookup('template', 'vhost.conf.j2') }}"
Récupérer une valeur d’un fichier CSV:
nom,prenom
lael,tirnan
bill,gate
elon,musk
marc,zuck
lookup('csvfile', 'bill file=boss.csv delimiter=, col=1')
lookup('csvfile', prenom + ' file=boss.csv delimiter=, col=1') # où prenom est une variable
Effectuer une recherche DNS TXT:
- name: Recherche TXT
debug:
msg: "{{ lookup('dnstxt', 'laeltirnan.com', 'qtype=TXT') }}"
Récupérer des informations de Redis:
$redis-cli SET temps soleil
$redis-cli SET temperature 25
- name: Obtenir le temps et la température
debug:
msg: "{{ lookup('redis', 'temps', 'temperature') }}"
Configuration de Redis :
[lookup_redis]
Fichier.ini
Host: redis2.exemple.com
Port: 6666
Nous explorerons des lookups plus avancés, des techniques de boucle et des exemples d’utilisation pratique
Voici une variété de lookup d’Ansible avancés pour des tâches plus complexes avec quelques exemples :
with_item : Ce plugin permet de parcourir une liste d’éléments et d’exécuter une tâche pour chaque élément.
- name: Ajouter des utilisateurs
become: true
user:
name: "{{ user.name }}"
with_items:
- { name: gil }
- { name: marc }
- { name: jean }
loop_control:
loop_var: user
Explications des éléments :
- name : Le nom de la tâche.
- become : Indique que la tâche doit être exécutée avec des privilèges élevés.
- user : Module utilisé pour gérer les utilisateurs.
- name : Nom de l’utilisateur à ajouter, tiré de la variable
user.name
. - with_items : Boucle à travers une liste d’éléments (ici, des dictionnaires contenant les noms des utilisateurs).
- loop_control : Contrôle de la boucle.
- loop_var : Variable de boucle personnalisée pour éviter les conflits avec d’autres variables.
Boucles avec with_item et loop_control
Vous pouvez utiliser loop_control pour contrôler le comportement de la boucle, comme définir une variable de boucle ou introduire un délai entre les itérations.
- name: Inclusion de tâches dans une boucle
include: vhost.yml
with_items:
- { domaine: msinfra.fr }
- { domaine: sport.laeltirnan.com }
- { domaine: son.laeltirnan.com }
- { domaine: laeltirnan.com }
loop_control:
loop_var: vhost
with_lines: Ce plugin permet de parcourir les lignes d’un fichier et d’exécuter une tâche pour chaque ligne.
- name: Lecture de lignes d'un fichier
say:
msg: "{{ item }}"
with_lines:
- cat files/techuser.txt
with_fileglob : Ce plugin permet de parcourir les fichiers correspondant à un motif glob et d’exécuter une tâche pour chaque fichier.
- name: Ajout de clés publiques
become: true
authorized_key:
user: deploy
key: "{{ lookup('file', item) }}"
with_fileglob:
- /var/keys/*.pub
- keys/*.pub
Explications des éléments :
- name : Le nom de la tâche.
- become : Indique que cette tâche doit être exécutée avec des privilèges élevés (sudo).
- authorized_key : Module utilisé pour ajouter une clé publique à l’utilisateur spécifié.
- user : L’utilisateur pour lequel la clé sera ajoutée (ici,
deploy
). - key : La clé publique à ajouter, lue depuis les fichiers correspondants à l’élément de la boucle.
- lookup(‘file’, item) : Fonction de recherche pour lire le contenu des fichiers.
- with_fileglob : Boucle à travers les fichiers correspondant aux motifs glob spécifiés.
- /var/keys/*.pub et keys/*.pub : Chemins des fichiers contenant les clés publiques.
Cet exemple ajoute toutes les clés publiques des fichiers correspondant aux motifs /var/keys/*.pub
et keys/*.pub
pour l’utilisateur deploy
.
Un motif glob (ou « glob pattern« ) est une forme de motif utilisé pour faire correspondre des chemins de fichiers en utilisant des caractères génériques. Il est couramment utilisé dans les systèmes de fichiers Unix et les scripts pour rechercher des fichiers ou des répertoires qui correspondent à un modèle spécifique. Voici quelques exemples courants de motifs glob :
*
(astérisque), ?
(point d’interrogation), [...]
(crochets),
**
(double astérisque).
Pour le double astérisque :
- Correspond récursivement à tous les fichiers et répertoires.
- Exemple :
**/*.txt
correspond à tous les fichiers avec l’extension.txt
dans tous les sous-répertoires.
with_dict : Ce plugin permet de parcourir un dictionnaire et d’exécuter une tâche pour chaque clé-valeur.
{
Variable tirée des facts
« address »: « 192.168.12.1 »,
« broadcast »: « 192.168.12.255 »,
« netmask »: « 255.255.255.255 »,
« network »: « 192.168.12.0 »
}
- name: Boucle sur ansible_eth0
debug:
msg: "{{ item.key }} = {{ item.value }}"
with_dict: "{{ ansible_eth0.ipv4 }}"
Création de fichiers de configuration dans une boucle
Vous pouvez utiliser une boucle with_items pour créer des fichiers de configuration avec des noms et des contenus dynamiques.
- name: Création de fichiers de configuration
file:
path: "/var/www/html/{{ vhost.domain }}/{{ item }}"
state: directory
with_items:
- logs
- public_http
- public_https
- includes
Cette configuration va créer les répertoires spécifiés dans la liste des éléments (logs
, public_http
, public_https
, includes
) dans le chemin /var/www/html/{{ vhost.domain }}/{{ item }}
.
Installation d’une liste de packages sans with_item
Il est possible d’installer une liste de packages sans utiliser with_item.
- name: Installation d'une liste de packages
become: true
Package:
name: "{{ list_packages }}"
state: present
Exemple de loop avec plusieurs tentatives :
- name: Décomprimer Maven
unarchive:
src: "{{ maven_url }}"
dest: "{{ maven_location }}"
copy: false
mode: '0755'
register: maven_download
until: maven_download is success
retries: 5
delay: 3
Exemple de loop complexe:
- name: Itérer avec une boucle
debug:
msg: "Entreprise : {{ item.ent }} Niveau: {{ i + 1 }} Secteur : {{ item.sec }}"
loop:
- ent: Microsoft
sec: Informatique
- ent: Nvidia
sec: Matériel
- ent: Samsung
sec: Téléphonie
- ent: AWS
sec: Cloud
Conclusion
L’utilisation des lookup d’Ansible offre une flexibilité et une puissance considérables dans la définition et l’exécution de tâches répétitives ou itératives. Que ce soit pour parcourir des listes d’éléments, des dictionnaires, des fichiers, ou encore pour exécuter des tâches sur des hôtes multiples, les boucles permettent de simplifier et d’automatiser de nombreuses opérations.
En utilisant des directives comme with_items
, with_dict
, with_lines
, with_fileglob
, ou encore loop
, Ansible nous donne les moyens de structurer nos playbooks de manière plus dynamique et expressive. Cela permet de réduire la duplication de code, d’améliorer la lisibilité des playbooks, et de rendre nos automatisations plus modulaires et réutilisables.
Que ce soit pour déployer des configurations sur des centaines de serveurs, installer des paquets logiciels, ou encore manipuler des données complexes, les boucles constituent un outil essentiel dans la boîte à outils de tout administrateur système ou développeur utilisant Ansible. En maîtrisant les différentes techniques de bouclage et en comprenant les subtilités de leur utilisation, nous pouvons créer des playbooks robustes et efficaces pour automatiser une large gamme de tâches système et réseau. En savoir plus