web-dev-qa-db-fra.com

Comment puis-je tester les modèles jinja2 dans ansible?

Parfois, j'ai besoin de tester certains modèles jinja2 que j'utilise dans mes rôles ansibles. Quel est le moyen le plus simple de faire cela?

Par exemple, j'ai un template (test.j2):

{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}

et vars (dans group_vars/all):

---
users:
  - Mike
  - Smith
  - Klara
  - Alex
44
Alex

Il existe actuellement 4 variantes différentes:

1_Online (utilisant https://cryptic-cliffs-32040.herokuapp.com/ )
Basé sur le code jinja2-live-parser .

Example

2_Interactive (en utilisant python et la bibliothèque jinja2, PyYaml)

import yaml
from jinja2 import Template
>>> template = Template("""
... {% if users is defined and users %}
... {% for user in users %}{{ user }}
... {% endfor %}
... {% endif %}
... """)
>>> values = yaml.load("""
... ---
... users:
...   - Mike
...   - Smith
...   - Klara
...   - Alex
... """)
>>> print "{}".format(template.render(values))


Mike
Smith
Klara
Alex

3_Ansible (en utilisant --check)
Créer un livre de test jinja2test.yml:

---
- hosts: 127.0.0.1
  tasks:
  - name: Test jinja2template
    template: src=test.j2 dest=test.conf

et lancez-le:

ansible-playbook jinja2test.yml --check --diff --connection=local

exemple de sortie:

PLAY [127.0.0.1] **************************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [Test jinja2template] ***************************************************
--- before: test.conf
+++ after: /Users/user/ansible/test.j2
@@ -0,0 +1,4 @@
+Mike
+Smith
+Klara
+Alex

changed: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1                  : ok=2    changed=1    unreachable=0    failed=0

4_Ansible (en utilisant le modèle -m) merci pour @artburkart

Créez un fichier appelé test.txt.j2

{% if users is defined and users %}
{% for user in users %}
{{ user }}
{% endfor %}
{% endif %}

Appelez ansible comme suit:

ansible all -i "localhost," -c local -m template -a "src=test.txt.j2 dest=./test.txt" --extra-vars='{"users": ["Mike", "Smith", "Klara", "Alex"]}'

Il produira un fichier nommé test.txt dans le répertoire en cours, qui contiendra le résultat de l’évaluation test.txt.j2 modèle.

Je comprends que cela n’utilise pas directement un fichier vars, mais j'estime que c'est le moyen le plus simple de tester un modèle sans utiliser de dépendances externes. De plus, je pense qu’il existe certaines différences entre ce que la bibliothèque jinja2 fournit et ce que fournit ansible. L’utilisation de ansible permet donc d’éviter directement les divergences. Lorsque le JSON alimenté à --extra-vars répond à vos besoins, vous pouvez le convertir en YAML et être sur votre chemin.

74
Alex

Si vous avez un template jinja2 appelé test.j2 et un fichier vars situé à l'adresse group_vars/all.yml, vous pouvez alors tester le modèle avec la commande suivante:

ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=@group_vars/all.yml

Il produira un fichier nommé test.txt dans le répertoire en cours, qui contiendra le résultat de l’évaluation test.j2 modèle.

Je pense que c'est le moyen le plus simple de tester un modèle sans utiliser de dépendances externes. De plus, il existe des différences entre ce que la bibliothèque jinja2 fournit et ce que fournit ansible, donc utiliser ansible contourne directement les écarts. Il est également possible de tester des variables ad-hoc sans créer de fichier vars supplémentaire à l'aide de JSON:

ansible all -i "localhost," -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars='{"users": ["Mike", "Smith", "Klara", "Alex"]}'
29
artburkart