Les Lookup d’Ansible dans des exemples concrets Part 1.2.4

ferris wheel in city
Photo by Pixabay on Pexels.com

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 :

  1. Le type de lookup: Il s’agit du nom du plugin de lookup que vous souhaitez utiliser. Par exemple, file, vars, pipe, etc.
  2. 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]
Host: redis2.exemple.com
Port: 6666

Fichier.ini

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.

{
« address »: « 192.168.12.1 »,
« broadcast »: « 192.168.12.255 »,
« netmask »: « 255.255.255.255 »,
« network »: « 192.168.12.0 »
}

Variable tirée des facts
- 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

Automation Experts

Rejoignez-nous pour une newsletter exclusive sur l'automatisation des experts informatique !

Obtenez les dernières tendances, astuces et outils pour optimiser vos processus, accélérer vos projets et libérer tout le potentiel de l'automatisation dans le monde de la technologie. Abonnez-vous dès maintenant pour rester à la pointe de l'innovation et transformer votre manière de travailler."

Comments

No comments yet. Why don’t you start the discussion?

    Alors tu en pense quoi de cette article ? Dis-moi tous..