it-swarm.com.ru

Как я могу проверить шаблоны jinja2 в ansible?

Иногда мне нужно протестировать некоторые шаблоны 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
44
Alex

На данный момент существует 4 разных варианта:

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

Example

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_Ansible (используя --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_Ansible (с помощью шаблона -m) спасибо за @artburkart

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

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

Назовите ansible так:

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, поэтому использование ansible напрямую обходит любые расхождения. Когда JSON, который подается на --extra-vars удовлетворяет ваши потребности, вы можете преобразовать его в YAML и быть в пути.

74
Alex

Если у вас есть шаблон 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, поэтому использование 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"]}'
29
artburkart