在Jinja2模板中转义golang模板

时间:2017-08-07 19:13:57

标签: go ansible jinja2

我有以下任务:

- name: Set default log options for Splunk
  set_fact:
    log_options_base:
       tag: "{{ '{{' }}.ImageName{{ '}}' }}/{{ '{{' }}.Name{{ '}}' }}/{{ '{{' }}.ID{{ '}}' }}"
       splunk-token: "{{ splunk_token }}"
       splunk-url: "{{ splunk_url }}"
       splunk-format: "json"
       splunk-index: "my-dx"
       labels: "{{ env }}"
  when:
    - log_driver is defined
    - log_driver == 'splunk'
- name: Set extendend log options for Splunk
  set_fact:
    log_options_ext: "{{ log_options_base | combine({ 'env': NODE_ENV }) }}"
  when:
     - log_options_base != ""

不幸的是,我遇到了以下问题:

template error while templating string: unexpected '.'. String: {{.ImageName}}/{{.Name}}/{{.ID}}\n\n

"The conditional check 'log_options_base != \"\"' failed.

问题肯定在golang模板上,但在我的情况下它已经被转义了。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

when语句本身是一个Jinja2表达式,因此Ansible会再次尝试评估您的字符串。

在这种情况下,你应该善于!unsafe输入:

- name: Set default log options for Splunk
  set_fact:
    log_options_base:
       tag: !unsafe "{{.ImageName}}/{{.Name}}/{{.ID}}"

但是我没有太多使用这种语法技巧,所以可能会有一些副作用,在生产使用之前测试它。

P.S。为什么要在log_options_base中将dict var log_options_base != ""与空字符串进行比较?您可能想要is defined测试吗?