我怎样才能测试 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
72421 次浏览

目前存在4种不同的变体:

1 _ Online (使用 https://cryptic-cliffs-32040.herokuapp.com/) < br > 基于 Jinja2-live-parser代码。

Example

2 _ Interactive (使用 python 和 library 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

安赛尔 (使用——检查)
创建测试剧本 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

感谢@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库提供的内容和 anable 提供的内容之间存在一些差异,因此使用 anable 可以直接避免任何差异。当提供给 --extra-vars的 JSON 满足您的需要时,您可以将其转换为 YAML,然后就可以上路了。

如果您有一个名为 test.j2的 jinja2模板和一个位于 group_vars/all.yml的 vars 文件,那么您可以使用以下命令测试该模板:

ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=@group_vars/all.yml

它将在工作目录中输出一个名为 test.txt的文件,其中将包含已评估的 test.j2模板的输出。

我认为这是在不使用任何外部依赖项的情况下测试模板的最简单方法。另外,jinja2库提供的内容和 anable 提供的内容之间也存在差异,因此使用 anable 可以直接避免任何差异。还可以使用 JSON 测试 ad-hoc 变量,而无需创建额外的 vars 文件:

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

您可以使用调试模块

tasks:
- name: show templating results
debug:
msg: "\{\{ lookup('template', 'template-test.j2') }}"

免责声明-我是本文的作者,但我把 JinjaFx (https://github.com/cmason3/jinjafx)放在一起。

这是一个基于 Python 的工具,允许您使用变量的 YAML 文件传递 Jinja2模板。我最初编写它是为了让它能够通过基于 CSV 的数据为我们的部署生成 group _ vars 和 host _ vars,但是它也允许轻松测试 Jinja2模板——在 https://jinjafx.io上有一个在线版本

我需要验证我所定义的模板是否为为其创建的服务器提供了正确的结果。(该模板将主机名作为一个变量和其他每个主机定义的变量。)

以上两种方法对我都不管用,我的解决办法是加法

  check_mode: yes
diff: yes

对于执行模板命令的任务,这使我得到了生成的文件和服务器上实际存在的文件之间的差异,而不需要更改远程文件。 对我来说,它实际上比查看整个生成的文件工作得更好,因为无论如何,更改是有趣的部分。 它需要登录到远程计算机上,因此用例有限。 完整命令示例:

- name: diff server.properties
check_mode: yes
diff: yes
ansible.builtin.template:
src: "src.properties"
dest: "/opt/kafka/config/server.properties"