如何防止Ansible剧本中的Jinja2替换?

时间:2016-05-31 06:48:39

标签: ansible jinja2 ansible-playbook configuration-management

在我的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文件中包含的变量?

3 个答案:

答案 0 :(得分:3)

即使使用{{'{{NET_SEG_VLAN}}'}},您也应该能够转义该变量,以告知jinja不要对该块内的任何内容进行模板化。

答案 1 :(得分:2)

您应该能够escape {% raw %}{% endraw %}变量告诉Jinja不要在该块内部模板化任何内容。

答案 2 :(得分:1)

!unsafe

摘自https://docs.ansible.com/ansible/2.10/user_guide/playbooks_advanced_syntax.html#unsafe-or-raw-strings上的文档:

在处理查找插件返回的值时,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!