Skip to main content
 首页 » 编程设计

jinja2之如何在 ansible 中测试 jinja2 模板

2024年06月03日14over140

有时我需要测试一些我在 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 并开始使用。