如何在ansible中测试jinja2模板? [英] How can I test jinja2 templates in ansible?

查看:33
本文介绍了如何在ansible中测试jinja2模板?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

{% 如果定义了用户和用户 %}{% for user in users %}{{ user }}{% 结束为 %}{% 万一 %}

和变量(在 group_vars/all 中):

---用户:- 迈克- 史密斯- 克拉拉- 亚历克斯

解决方案

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

1_Online(使用

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

导入yaml从 jinja2 导入模板>>>模板 = 模板("""... {% 如果定义了用户和用户 %}... {% for user in users %}{{ user }}... {% endfor %}... {% 万一 %}... """)>>>values = yaml.load("""... ---... 用户:... - 迈克... - 史密斯... - 克拉拉... - 亚历克斯... """)>>>打印 "{}".format(template.render(values))麦克风史密斯克拉拉亚历克斯

3_Ansible(使用 --check)
创建测试剧本jinja2test.yml:

---- 主机:127.0.0.1任务:- 名称:测试 jinja2template模板:src=test.j2 dest=test.conf

并运行它:

ansible-playbook jinja2test.yml --check --diff --connection=local

示例输出:

PLAY [127.0.0.1] ******************************************************************收集事实 *******************************************************************好的:[127.0.0.1]任务:[测试jinja2template] *******************************************************--- 之前:test.conf+++ 之后:/Users/user/ansible/test.j2@@ -0,0 +1,4 @@+迈克+史密斯+克拉拉+亚历克斯更改:[127.0.0.1]播放回顾 ************************************************************************127.0.0.1 : ok=2 改变=1 不可达=0 失败=0

4_Ansible(使用 -m 模板)感谢@artburkart

制作一个名为 test.txt.j2 的文件

{% 如果定义了用户和用户 %}{% for user in users %}{{ 用户 }}{% 结束为 %}{% 万一 %}

像这样调用 ansible:

ansible all -i "localhost," -c local -m template -a "src=test.txt.j2 dest=./test.txt" --extra-vars='{"users":[迈克"、史密斯"、克拉拉"、亚历克斯"]}'

它将在当前目录中输出一个名为 test.txt 的文件,该文件将包含评估后的 test.txt.j2 模板的输出.

我知道这不直接使用 vars 文件,但我认为这是在不使用任何外部依赖项的情况下测试模板的最简单方法.另外,我相信 jinja2 库提供的内容与 ansible 提供的内容之间存在一些差异,因此直接使用 ansible 可以避免任何差异.当提供给 --extra-vars 的 JSON 满足您的需求时,您可以将其转换为 YAML 并继续使用.

Sometimes I need to test some jinja2 templates that I use in my ansible roles. What is the simplest way for doing this?

For example, I have a template (test.j2):

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

and vars (in group_vars/all):

---
users:
  - Mike
  - Smith
  - Klara
  - Alex

解决方案

At this time exists 4 different variants:

1_Online (using https://cryptic-cliffs-32040.herokuapp.com/)
Based on jinja2-live-parser code.

2_Interactive (using python and 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

3_Ansible (using --check)
Create test playbook jinja2test.yml:

---
- hosts: 127.0.0.1
  tasks:
  - name: Test jinja2template
    template: src=test.j2 dest=test.conf

and run it:

ansible-playbook jinja2test.yml --check --diff --connection=local

sample output:

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 (using -m template) thanks for @artburkart

Make a file called test.txt.j2

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

Call ansible like so:

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

It will output a file called test.txt in the current directory, which will contain the output of the evaluated test.txt.j2 template.

I understand this doesn't directly use a vars file, but I think it's the simplest way to test a template without using any external dependencies. Also, I believe there are some differences between what the jinja2 library provides and what ansible provides, so using ansible directly circumvents any discrepancies. When the JSON that is fed to --extra-vars satisfies your needs, you can convert it to YAML and be on your way.

这篇关于如何在ansible中测试jinja2模板?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆