Python

7 Utilisation de modèles

Dans l’environnement système (DHCP, RADIUS, …) comme dans l’environnement réseau (configurations), il est fréquent de retrouver des fichiers dont la structure est constante mais dont certains passages peuvent varier en fonction du contexte. C’est dans ce cadre là que l’utilisation de modèles ou « Templates » présente un intérêt. Jinja2 est le moteur de « Template » le plus utilisé avec le langage Python dans le monde du réseau et ce n’est pas un hasard si c’est celui qui a été choisi pour l’environnement Ansible.

Cette librairie se présente comme un langage permettant de générer des parties variables à l’intérieur d’un document type devant être produit. Pour illustrer ces propos, prenons le cas d’un fichier de configuration d’un commutateur de réseau. Celui-ci contient des parties qui se répètent en fonction des VLANs nécessaires. Il est possible d’écrire un modèle de base qui permettra de générer autant de ligne de commande qu’il y aura de VLANs à mettre en place :

! VLAN:
{% for vlan in my_vlans %}
vlan {{ vlan.id }} admin-state enable
vlan {{ vlan.id }} name "{{ vlan.name }}"
{% endfor %}

A la lecture de ce modèle, on comprend qu’un dictionnaire peut contenir des couples (id, name) pour chaque VLAN à créer. L’objet vlan, récupéré à chaque itération, est transmis au modèle pour générer les lignes supplémentaires. Il n’existe pas qu’une seule façon d’utiliser un « Template » Jinja2 et la syntaxe dépend de la façon dont les données ont été définies. Une des façons de l’utiliser est abordé plus en détail dans le contexte de l’outil d’automatisation Ansible.