例如,我有一个模板(test.j2):
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
在组变量(group_vars/all)中可以定义变量:
---
users:
- Mike
- Smith
- Klara
- Alex
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
---
users:
- Mike
- Smith
- Klara
- Alex
目前存在四种不同的变体:
1_在线版(使用https://cryptic-cliffs-32040.herokuapp.com/)
基于jinja2-live-parser代码。
2_交互式(使用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
的变量文件,则可以使用以下命令测试该模板:
如果您有一个名为test.j2
的jinja2模板,以及一个位于group_vars/all.yml
的变量文件,则可以使用以下命令测试该模板:
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') }}"
我需要确认我定义的模板针对创建它的服务器给出正确结果。(该模板包括主机名变量和其他按主机定义的变量)
以上两种方法都对我无效。对我而言解决方案是添加
check_mode: yes
diff: yes
- name: 比较server.properties文件 check_mode: yes diff: yes ansible.builtin.template: src: "src.properties" dest: "/opt/kafka/config/server.properties"