2017-08-07 131 views
0

我有以下任務:逃離golang模板

- 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模板,但它已經在我的情況下逃脫了。

有什麼想法?

+0

您可以嘗試使用不同的模板分隔符,因此可能不需要轉義。 – jeevatkm

+0

@jeevatkm請你詳細說明一下嗎? – Mazzy

+0

默認情況下,Go模板分隔符是「{{}}」,您可以選擇更改它。例如:通過[template.Delims]到[[[]]'(https://golang.org/pkg/text/template/#Template.Delims)。 – jeevatkm

回答

1

when聲明是一個Jinja2表達式本身,所以Ansible試圖再次評估您的字符串。

你要善於在這種情況下!unsafe打字:

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

但我沒用過這招語法太多,所以有可能會出現一些副作用,之前生產的使用測試。

P.S.你爲什麼要比較字典var log_options_baselog_options_base != ""中的空字符串?可能你想is defined測試?

+0

現在這個錯誤消失了,但是'tag'屬性像這樣呈現出來了:''''' – Mazzy

+0

剛剛測試過它,只用了2.2 .1似乎按預期工作。你在什麼版本上? –

+0

2.2.2.0 ansible – Mazzy