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
Il existe actuellement 4 variantes différentes:
1_Online (utilisant https://cryptic-cliffs-32040.herokuapp.com/ )
Basé sur le code jinja2-live-parser .
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.
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"]}'