有时我需要测试一些我在 ansible 角色中使用的 jinja2 模板。最简单的方法是什么?
例如,我有一个模板(test.j2):
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
和变量(在group_vars/all中):
---
users:
- Mike
- Smith
- Klara
- Alex
请您参考如下方法:
目前存在 4 种不同的变体:
1_Online(使用 https://cryptic-cliffs-32040.herokuapp.com/ )
基于 jinja2-live-parser代码。
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 直接避免任何差异。当提供给 --extra-vars
的 JSON 满足您的需求时,您可以将其转换为 YAML 并开始使用。