Как проверить тестовые шаблоны jinja2?

Иногда мне нужно протестировать некоторые шаблоны jinja2, которые я использую в моих незаменимых ролях. Каков самый простой способ для этого?

Например, у меня есть шаблон (test.j2):

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

и vars (в group_vars/all):

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

Ответ 1

В это время существует 4 разных варианта:

1_Online (используя http://jinja2test.tk или https://cryptic-cliffs-32040.herokuapp.com/)
На основе jinja2-live-parser code.

Пример

2_Interactive (используя python и библиотеку 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_Anible (с помощью --check)
Создать тестовую книгу jinja2test.yml:

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

и запустите его:

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

вывод образца:

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_Anible (с использованием шаблона -m) спасибо за @artburkart

Сделайте файл с именем test.txt.j2

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

Позвонить так:

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

Он выведет файл с именем test.txt в текущем каталоге, который будет содержать результат оцененного шаблона test.txt.j2.

Я понимаю, что это напрямую не использует файл vars, но я думаю, что это самый простой способ протестировать шаблон без каких-либо внешних зависимостей. Кроме того, я считаю, что есть некоторые различия между тем, что предоставляет библиотека jinja2, и тем, что может быть доступно, поэтому использование ansible напрямую обходит любые несоответствия. Когда JSON, который подается на --extra-vars, удовлетворяет вашим потребностям, вы можете преобразовать его в YAML и быть на вашем пути.

Ответ 2

Если у вас есть шаблон jinja2 с именем test.j2 и файл vars, расположенный в group_vars/all.yml, вы можете протестировать шаблон со следующей командой:

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

Он выведет файл с именем test.txt в текущем каталоге, который будет содержать результат оцененного шаблона test.j2.

Я думаю, что это самый простой способ протестировать шаблон без каких-либо внешних зависимостей. Кроме того, существуют различия между тем, что предоставляет библиотека jinja2, и тем, что может быть доступно, поэтому использование ansible напрямую обходит любые несоответствия. Также возможно протестировать переменные ad-hoc без создания дополнительного файла vars с помощью JSON:

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