it-swarm.com.de

Wie kann ich jinja2 Templates in Ansible testen?

Manchmal muss ich einige jinja2-Vorlagen testen, die ich in meinen ansiblen Rollen verwende. Was ist der einfachste Weg, dies zu tun?

Zum Beispiel habe ich eine Vorlage (test.j2):

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

und vars (in group_vars/all):

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

Zur Zeit existieren 4 verschiedene Varianten:

1_Online (mit https://cryptic-cliffs-32040.herokuapp.com/ )
Basierend auf jinja2-live-parser code.

Example

2_Interactive (mit python und Bibliothek 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 (mit --check)
Test-Playbook jinja2test.yml erstellen:

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

und führe es aus:

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

beispielausgabe:

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 (mit -m template) danke für @artburkart

Erstellen Sie eine Datei mit dem Namen test.txt.j2

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

Rufe ansible so auf:

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

Es wird eine Datei mit dem Namen test.txt Im aktuellen Verzeichnis ausgegeben, die die Ausgabe der ausgewerteten Vorlage test.txt.j2 Enthält.

Ich verstehe, dass dies nicht direkt eine VARS-Datei verwendet, aber ich denke, es ist der einfachste Weg, eine Vorlage zu testen, ohne externe Abhängigkeiten zu verwenden. Außerdem glaube ich, dass es einige Unterschiede zwischen dem, was die jinja2-Bibliothek bietet, und dem, was ansible bietet, gibt. Wenn Sie ansible also direkt verwenden, werden Diskrepanzen umgangen. Wenn der JSON-Code, der an --extra-vars Übergeben wird, Ihren Anforderungen entspricht, können Sie ihn in YAML konvertieren und loslegen.

74
Alex

Wenn Sie eine jinja2-Vorlage mit dem Namen test.j2 Und eine vars-Datei unter group_vars/all.yml Haben, können Sie die Vorlage mit dem folgenden Befehl testen:

ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" [email protected]_vars/all.yml

Es wird eine Datei mit dem Namen test.txt Im aktuellen Verzeichnis ausgegeben, die die Ausgabe der ausgewerteten Vorlage test.j2 Enthält.

Ich denke, dies ist die einfachste Möglichkeit, eine Vorlage zu testen, ohne externe Abhängigkeiten zu verwenden. Außerdem gibt es Unterschiede zwischen dem, was die jinja2-Bibliothek bereitstellt, und dem, was ansible bereitstellt. Wenn ansible verwendet wird, werden Unstimmigkeiten direkt umgangen. Es ist auch möglich, Ad-hoc-Variablen mit JSON zu testen, ohne eine zusätzliche vars-Datei zu erstellen:

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