Vous avez du mal à gérer des configurations complexes et dynamiques avec Ansible ?
Cela peut entraîner des erreurs de configuration et une maintenance accrue de vos systèmes.
Découvrez comment les modèles Ansible, via le moteur Jinja2, peuvent simplifier et dynamiser vos fichiers de configuration.
Devenez un expert d'Ansible et simplifiez vos tâches d'administration.

Modèles Ansible : Introduction
Les modèles (ou templates) dans Ansible sont des fichiers texte qui utilisent le moteur de templates Jinja2. Ils permettent de créer des fichiers de configuration dynamiques en insérant des variables et des expressions conditionnelles.
Système Jinja2 :
- Jinja2 est un moteur de template pour Python, utilisé par Ansible pour rendre les modèles.
- Il permet d’insérer des variables, d’effectuer des boucles, des conditions et d’autres logiques directement dans les fichiers modèles.
- Avec Jinja2, vous pouvez créer des fichiers de sortie complexes et dynamiques, basés sur les données fournies par Ansible.
Voici un diagramme montrant comment est modelié Jinja2
Dans Jinja2, les variables sont définies et passées depuis Ansible. Elles peuvent représenter des valeurs telles que des adresses IP, des noms de domaine, des chemins de fichiers. Et Jinja2 permet l’utilisation d’expressions pour manipuler les données et contrôler la logique à l’intérieur des templates.
Dans Jinja2, on peut utiliser des filtres pour manipuler et de transformer des données directement à l’intérieur des templates.
A l’utilisation des filtres nous permet de faire des taches suivant :
- Transformer de JSON en YAML :Filtre : to_yaml : Ce filtre transforme des données JSON en format YAML.
Exemple : {{ my_json_data | to_yaml }}
- Diviser une URL pour extraire le nom d’hôte :Filtre : urlsplit : Ce filtre divise une URL en composants (schéma, nom d’hôte, chemin, etc.) et permet d’accéder au nom d’hôte.
Exemple : {% set hostname = my_url | urlsplit | hostname %}
- Obtenir le hachage SHA1 d’une chaîne :Filtre : hash(‘sha1’) : Ce filtre calcule le hachage SHA1 d’une chaîne de caractères.
Exemple : {{ my_string | hash(‘sha1’) }}
- Gérer les variables manquantes ou indéfinies :Filtre : default : Ce filtre permet de définir une valeur par défaut pour une variable qui pourrait être manquante ou indéfinie.
Exemple : {{ my_variable | default(‘valeur_par_defaut’) }}
Voici un exemple de playbook complet utilisant un template :
---
- hosts: servers
tasks:
- name: Template a file to /etc/file.conf
ansible.builtin.template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: '0644'
Ce script utilise un modèle Jinja2 pour générer un fichier de configuration /etc/file.conf sur les serveurs spécifiés, en appliquant des permissions spécifiques et en définissant le propriétaire et le groupe du fichier.
Passons maintenant à la pratique pour mieux comprendre les modeles en Ansible.Voici uun playbook que nous executer :
---
- hosts: servers
tasks:
- name: Add configuration file from template
template:
src: formation.conf.j2
dest: /tmp/formation.conf
hosts : servers : spécifie les hôtes sur lesquels cette tâche Ansible sera exécutée.
tasks :: indique le début des tâches à exécuter sur les hôtes spécifiés.
– name : Add configuration file from template: nom de la tâche pour l’identification et le reporting.
template :: utilise le module template d’Ansible pour générer un fichier en utilisant un modèle Jinja2.
src: formation.conf.j2: chemin du fichier modèle Jinja2 à utiliser pour générer le fichier de configuration.
dest: /tmp/formation.conf: chemin absolu où le fichier de configuration généré sera créé.
Vous vous demandez peut-être quelle est la différence entre template ou modèle et le module copy. Eh bien, vous avez tout à fait raison.
Template ou Modèle : Utilisé lorsque nous avons besoin de générer dynamiquement un fichier en utilisant un modèle Jinja2. Le fichier modèle peut inclure des variables et des logiques de programmation simplifiée grâce à Jinja2.
Copy : Utilisé pour copier un fichier (local ou distant) vers un emplacement spécifié sur l’hôte cible sans modification ni interprétation. Il ne prend pas en charge les modèles Jinja2 et ne permet pas de générer dynamiquement des fichiers en fonction de variables ou de logiques.
Donc pour pouvoir exécuter ce playbook correctement, nous devons d’abord créer fichier formation.conf.j2 comme source avec son contenu comme ceci :
host_name ={{inventory_hostname}}
local_ip= {{ansible_default_ipv4["address"]}}
gateway= {{ansible_default_ipv4.gateway}}
kernel_version= {{ansible_kernel_version}}
Ce script Ansible utilise des variables spéciales fournies par Ansible pour récupérer des informations telles que le nom de l’hôte, l’adresse IP locale, la passerelle par défaut et la version du noyau. Ces informations peuvent être utilisées dans des playbooks pour personnaliser les configurations ou effectuer des actions en fonction des caractéristiques spécifiques de chaque hôte dans l’inventaire.
Copions ce script maintenant dans le fichier formation.conf.j2
Créons maintenant le playbook dans le fichier template-playbook.yml
Nous pouvons exécuter maintenant le playbook en laçant la commande suivante : ansible-playbook -v template-playbook.yml et nous aurons le résultat comme ceci après :
Cool,,,,,,, le résultat confirme que la tâche du playbook a été exécutée avec succès. Nous allons maintenant vérifier si les informations que nous cherchons à récupérer dans le script ont été obtenues. En examinant le fichier formation.conf sur le nœud de contrôle, voici ce que nous trouvons : »
Super, le playbook était exécuté avec succès.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment fonctionnent les modèles Ansible ?
Qu'est-ce que le moteur Jinja2 ?
Quels sont les filtres disponibles dans Jinja2 ?
Comment utiliser un playbook Ansible avec un modèle Jinja2 ?
Quelle est la différence entre template et copy dans Ansible ?
Conclusion
L’utilisation des modèles Ansible avec Jinja2 offre une flexibilité et une puissance incroyables pour vos configurations. Quelle nouvelle fonctionnalité Jinja2 aimeriez-vous explorer pour enrichir vos playbooks?