Recherche de site Web

Comment créer des modèles dans Ansible pour créer des configurations sur des nœuds gérés - Partie 7


Dans cette Partie 7 de la série Ansible, vous apprendrez à créer et à utiliser des modèles dans Ansible pour créer des configurations personnalisées sur des nœuds gérés. La création de modèles dans Ansible est un moyen simple et convivial de transmettre des configurations personnalisées à des nœuds gérés exécutant différents systèmes avec une modification minimale des fichiers playbook.

Qu’est-ce que la création de modèles dans Ansible ?

Pour avoir une meilleure idée de ce qu'est un modèle, prenons l'exemple d'un responsable informatique rédigeant un e-mail pour inviter son service à un cocktail. L'e-mail est envoyé à chacun des membres et les invite également à rejoindre leur conjoint.

L'e-mail a été personnalisé de telle sorte que le corps de l'e-mail reste le même, mais les destinataires et les noms de leurs conjoints respectifs varient. L'e-mail devient le modèle, tandis que les destinataires et les conjoints respectifs sont des variables.

C'était un exemple générique. Ansible utilise Jinja2 qui est un moteur de création de modèles moderne pour les frameworks Python utilisés pour générer du contenu ou des expressions dynamiques. Les modèles sont extrêmement utiles lors de la création de fichiers de configuration personnalisés pour plusieurs serveurs, mais uniques pour chacun d'eux.

Jinja2 utilise les doubles accolades {{ ... }} pour encadrer une variable qui a été définie. Pour les commentaires, utilisez {{# #} et pour les instructions conditionnelles, utilisez {% … %}.

Supposons que vous disposez d'un modèle de données de VLAN dans votre réseau avec des systèmes hôtes que vous souhaitez transmettre à leurs VLAN respectifs, comme indiqué.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Pour afficher cette configuration, le modèle jinja2 correspondant appelé vlans.j2 apparaîtra comme indiqué. Comme vous pouvez le constater, les variables vlan.id et vlan.name ont été placées entre accolades.

vlan {{ vlan.id }}
  name {{ vlan.name }}

En rassemblant le tout dans un playbook qui place différentes machines hôtes, cela apparaîtrait comme indiqué :

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Exemple 1 : configuration de serveurs Web dans différentes distributions

Dans cet exemple, nous allons créer des fichiers index.html qui afficheront des informations sur le nom d'hôte et le système d'exploitation de 2 serveurs Web exécutant CentOS et Ubuntu. .

Installation

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Le serveur Web Apache a déjà été installé sur les deux serveurs.

Pour CentOS 7

Pour Ubuntu 18.04

Créons donc un playbook test_server.yml comme indiqué :

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Notre modèle de fichier Jinja est index.html.j2 qui sera poussé vers le fichier index.html sur chaque serveur Web. N'oubliez jamais de mettre l'extension .j2 à la fin pour signifier qu'il s'agit d'un fichier jinja2.

Créons maintenant le fichier modèle index.html.j2.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Ce modèle est un fichier HTML de base dans lequel ansible_hostname et ansible_os_family sont des variables intégrées qui seront remplacées par les noms d'hôte et les systèmes d'exploitation respectifs des serveurs Web individuels du navigateur.

Maintenant, exécutons le playbook.

ansible-playbook test_server.yml

Rechargeons maintenant les pages Web des serveurs Web CentOS 7 et Ubuntu.

Pour CentOS 7

Pour Ubuntu 18.04

Comme vous pouvez le constater, différentes informations sur le nom d'hôte et la famille du système d'exploitation ont été affichées sur chaque serveur. Et c’est à quel point les modèles Jinja2 sont cool !

FILTRES :

Parfois, vous pouvez décider de remplacer la valeur d'une variable par une chaîne qui apparaît d'une certaine manière.

Exemple 1 : faire apparaître les chaînes en majuscules/minuscules

Par exemple, dans l’exemple précédent, on peut décider de faire apparaître les variables Ansible en majuscules. Pour ce faire, ajoutez la valeur supérieure à la variable. De cette façon, la valeur de la variable est convertie au format majuscule.

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

De même, vous pouvez convertir la sortie de chaîne en minuscules en ajoutant l'argument inférieur.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Exemple 2 : remplacer une chaîne par une autre

De plus, vous pouvez remplacer une chaîne par une autre.

Par exemple:

Le titre du film est {{ movie_name }} => Le titre du film est Ring.

Pour remplacer la sortie par une autre chaîne, utilisez l'argument replace comme indiqué :

Le titre du film est {{ movie_name | remplacer (« Ring », « Heist ») }} => Le titre du film est Heist.

Exemple 3 : listes et ensembles de filtres

Pour récupérer la plus petite valeur d'un tableau, utilisez le filtre min.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

De même, pour récupérer le plus grand nombre, utilisez le filtre max.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Pour afficher des valeurs uniques, utilisez le filtre unique.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

Utilisez le filtre aléatoire pour obtenir un nombre aléatoire compris entre 0 et la valeur.

{{ 50 | random }} =>  Some random number

BOUCLES :

Tout comme dans les langages de programmation, nous avons des boucles dans Ansible Jinja2.

Par exemple, pour générer un fichier contenant une liste de nombres, utilisez la boucle for comme indiqué dans l'exemple ci-dessous :

Exemple 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

Vous pouvez également combiner la boucle for avec des instructions if-else pour filtrer et obtenir certaines valeurs.

Exemple 2 :

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

Et c’est tout pour cette conférence. Rejoignez-nous dans le prochain sujet où nous nous aventurerons dans le travail avec des variables et des faits ansibles.