Ajout du contenu de la séance 3

master
dan 2020-11-20 19:10:07 +01:00
parent 2a44793663
commit 02b5122cb8
1 changed files with 164 additions and 0 deletions

164
chapitre11.md Normal file
View File

@ -0,0 +1,164 @@
# 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 <le champ listen> <liste param> ssl verify none`
5. Même chose mais sinon écrire `bind <le champ listen> <liste param>`
#### 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 %}
```