atelier_automatisation/chapitre11.md

3.5 KiB

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
vlans:
    - id: 10
      name: wan

# JSON
vlans = [{'id': '10', 'name': 'wan'}]
# 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 :

{{ variable }}

Parcourir une liste :

{% for frontend in haproxy_frontend %}
{{ frontend }}
{% endfor %}

Condition :

{% if haproxy_frontend is defined %}

{% endif %}

Ecrire les valeurs d'une liste en les séparant par des virgules :

{{ 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

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 <le champ listen> <liste param> ssl verify none
  5. Même chose mais sinon écrire bind <le champ listen> <liste param>

Correction

  1. Code
{% for frontend in haproxy_frontend %}
{{ frontend.name }}
{% endfor %}
  1. Code
{% for frontend in haproxy_frontend %}
{{ frontend.bind }}
{% endfor %}
  1. Code
{% for frontend in haproxy_frontend %}
{% for valeur in frontend.bind %}
{{ valeur.param }}
{% endfor %}
{% endfor %}
  1. Code
{% 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 %}
  1. Code
{% 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 %}
  1. Code Optimisé
{% 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 %}