# Chapitre 1.1 : Les templates pour Ansible Comme nous l'avions vu dans le chapitre précédent l'un des objectifs principaux d'Ansible est de déployer des fichiers de configuration. Nous allons découvrir maintenant la syntaxe YAML et la création de templates Jinja2 pour Ansible. ## YAML Il faut savoir que le YAML est complètement compatible avec JSON, la syntaxe est volontairement simplifié au maximum pour être facilement lisible. Il est en outre possible d'y insérer directement du JSON pour réaliser certaines structures complexes. ### Les listes Voici quelques exemples : ```yaml # YAML vlans: - id: 10 name: wan # JSON vlans = [{'id': '10', 'name': 'wan'}] ``` ```yaml # YAML front: - default_backend: user-in name: https-in bind: - listen: '::443' param: - v4v6 mode: 'tcp' # JSON front = [{'default_backend':•'user-in',•'name':•'https-in',•'bind':•[{'listen':•':::443',•'param':•['v4v6']}],•'mode':•'tcp'}] ``` ## Jinja2 Jinja2 est un moteur de templates, c'est à dire un langage qui permet de générer des fichier à partir de structures génériques et des variables. Documentation officielle : https://jinja.palletsprojects.com/en/2.11.x/templates/ ### Les bases du langage Afficher une variable : ```jinja2 {{ variable }} ``` Parcourir une liste : ```jinja2 {% for frontend in haproxy_frontend %} {{ frontend }} {% endfor %} ``` Condition : ```jinja2 {% if haproxy_frontend is defined %} {% endif %} ``` Ecrire les valeurs d'une liste en les séparant par des virgules : ```jinja2 {{ liste | join(', ') }} ``` Écrire un commentaire : ``` {# Ceci est un commentaire #} ``` ### Pour s'entrainer Testeurs de template : https://ansible.sivel.net/test/ https://cryptic-cliffs-32040.herokuapp.com/ #### Exercice ```yaml haproxy_frontend: - name: all-in mode: tcp bind: - listen: ':::80' param: - v4v6 - accept-proxy - listen: ':::443' param: - v4v6 default_backend: user-in ``` 1. Afficher la valeur du champ name 2. Afficher la valeur du champ bind 3. Afficher le champ param de chaque élément de bind 4. Vérifier que accept-proxy est défini dans les champs param, si c'est le cas écrire `bind ssl verify none` 5. Même chose mais sinon écrire `bind ` #### Correction 1. Code ```jinja2 {% for frontend in haproxy_frontend %} {{ frontend.name }} {% endfor %} ``` 2. Code ```jinja2 {% for frontend in haproxy_frontend %} {{ frontend.bind }} {% endfor %} ``` 3. Code ```jinja2 {% for frontend in haproxy_frontend %} {% for valeur in frontend.bind %} {{ valeur.param }} {% endfor %} {% endfor %} ``` 4. Code ```jinja2 {% for frontend in haproxy_frontend %} {% for valeur in frontend.bind %} {% if 'accept-proxy' in valeur.param %} bind {{ valeur.listen }} {{ valeur.param | join(' ') }} ssl verify none {% endif %} {% endfor %} {% endfor %} ``` 5. Code ```jinja2 {% for frontend in haproxy_frontend %} {% for valeur in frontend.bind %} {% if 'accept-proxy' in valeur.param %} bind {{ valeur.listen }} {{ valeur.param | join(' ') }} ssl verify none {% else %} bind {{ valeur.listen }} {{ valeur.param | join(' ') }} {% endif %} {% endfor %} {% endfor %} ``` 5. Code Optimisé ```jinja2 {% for frontend in haproxy_frontend %} {% for option in frontend.bind %} bind {{ option.listen }} {{ option.param | join(' ') }}{% if 'accept-proxy' in option.param %} ssl verify none{% endif %} {% endfor %} {% endfor %} ```