如何在ansible中测试jinja2模板?

如何在ansible中测试jinja2模板?,ansible,jinja2,ansible-playbook,ansible-template,Ansible,Jinja2,Ansible Playbook,Ansible Template,有时我需要测试一些我在ansible角色中使用的jinja2模板。最简单的方法是什么 例如,我有一个模板(test.j2): 和变量(在组\变量/所有中): 此时存在4种不同的变体: 1_在线(使用)基于代码 2_Interactive(使用python和库jinja2,PyYaml) 3_-Ansible(使用--check) 创建测试剧本jinja2test.yml: --- - hosts: 127.0.0.1 tasks: - name: Test jinja2template

有时我需要测试一些我在ansible角色中使用的jinja2模板。最简单的方法是什么

例如,我有一个模板(test.j2):

和变量(在组\变量/所有中):


此时存在4种不同的变体:

1_在线(使用)
基于代码

2_Interactive(使用python和库jinja2,PyYaml)

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\u 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并开始使用。

如果您有一个名为
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库提供的内容与ansible提供的内容之间存在差异,因此使用ansible可以直接避免任何差异。还可以使用JSON测试特殊变量,而无需创建额外的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()放在了一起


这是一个基于Python的工具,允许您通过变量的YAML文件传递Jinja2模板。我最初编写它是为了让它可以传递基于CSV的数据来为我们的部署生成组变量和主机变量,但它也允许轻松测试Jinja2模板-在

上有一个在线版本,其中没有一个在缺少变量方面具有相同的行为。缺少的变量在ansible中失败,但在上面似乎默认为false/empty。@AutomatedMike,我的答案-似乎是用上面的属性偷来的-与缺少的变量一样失败expect@Alex请删除“Jinja2test.tk”-不幸的是,该域似乎已被垃圾邮件类型接管,那个里并没有在线测试。还有一个在线服务:这里有来源:我把你们的答案添加到列表中。我很欣赏ansible原生方式,也允许你们使用ansible过滤器。
ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=@group_vars/all.yml
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') }}"