在我的Playbook中,使用include_vars
模块包含一个JSON文件。 JSON文件的内容如下所示:
{
"Component1": {
"parameter1" : "value1",
"parameter2" : "value2"
},
"Component2": {
"parameter1" : "{{ NET_SEG_VLAN }}",
"parameter2": "value2"
}
}
在剧本中包含JSON文件之后,我使用uri
模块发送了一个http请求,如下所示:
- name: Configure Component2 variables using REST API
uri:
url: "http://0.0.0.0:5000/vse/api/v1.0/config/working/Component2/configvars/"
method: POST
return_content: yes
HEADER_x-auth-token: "{{ login_resp.json.token }}"
HEADER_Content-Type: "application/json"
body: "{{ Component2 }}"
body_format: json
可以看出,http请求的主体是使用JSON数据Component2
发送的。但是,Jinja2尝试替换JSON文件中的{{ NET_SEG_VLAN }}
并抛出undefined
错误。目的不是使用Jinja2替换JSON文件中的任何内容,并在http请求中发送正文。
如何防止Jinja2替换JSON文件中包含的变量?
答案 0 :(得分:3)
即使使用{{'{{NET_SEG_VLAN}}'}},您也应该能够转义该变量,以告知jinja不要对该块内的任何内容进行模板化。
答案 1 :(得分:2)
您应该能够escape {% raw %}
和{% endraw %}
变量告诉Jinja不要在该块内部模板化任何内容。
答案 2 :(得分:1)
!unsafe
在处理查找插件返回的值时,Ansible使用名为
unsafe
的数据类型来阻止模板。将数据标记为不安全可防止恶意用户滥用Jinja2模板在目标计算机上执行任意代码。 Ansible实现可确保不对不安全的值进行模板化。它比使用{% raw %} ... {% endraw %}
标记转义Jinja2更为全面。您可以在定义的变量中使用相同的
unsafe
数据类型,以防止模板错误和信息泄露。您可以将vars_prompts提供的值标记为unsafe
。您还可以在剧本中使用不安全的内容。最常见的用例包括允许使用{
或%
之类的特殊字符的密码,以及看起来像模板但不应被模板化的JSON参数。
我一直在使用它,就像这样:
# Load JSON content, as a raw string with !unsafe
- tags: ["always"]
set_fact:
dashboard_content: !unsafe "{{ lookup('file', './dash.json') | to_json }}"
# Build dictionnary via template
- tags: ["always"]
set_fact:
cc: "{{ lookup('template', './templates/cm_dashboard.yaml.j2') | from_yaml }}"
## cm_dashboard.yaml.j2 content:
hello: {{ cc_dashboard_content }}
# Now, "cc" is a dict variable, with "hello" field protected!