繁体   English   中英

如何在ansible中测试jinja2模板?

[英]How can I test jinja2 templates in ansible?

有时我需要测试一些我在 ansible 角色中使用的 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

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

1_在线(使用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 并开始使用。

如果您有一个名为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 ( 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM