2016-07-25 89 views
2

在調試帶過濾器鏈接的條件子句並檢查未定義變量(omit)時,我發現結果取決於過濾器如何包含在字符串中。Ansible:使用Jinja2過濾器鏈接時「省略佔位符」

我的意圖是在條件中爲value作出Ansible任務的when子句。每個「注」在鏈接Ansible documentation,我試着加入omit並得到以下結果。

我的劇本:

--- 
- hosts: target 
    tasks: 
    - debug: msg="{{ value_not_defined|default('0') | int or omit }}" 
    - debug: msg="debug {{ value_not_defined|default('0') | int or omit }}" 

結果的相關部分:

TASK [debug] ******************************************************************* 
ok: [192.168.1.2] => { 
    "msg": "Hello world!" 
} 

msg: Hello world! 

TASK [debug] ******************************************************************* 
ok: [192.168.1.2] => { 
    "msg": "debug __omit_place_holder__31268e787e722b495d512986994bcd66ce943a69" 
} 

msg: debug __omit_place_holder__63eea0d96dd6ed867b95405e11d87dddf61f448d 

在哪裏以下結果從何而來?

  • Hello world!
  • __omit_place_holder__63eea0d96dd6ed867b95405e11d87dddf61f448d

爲什麼取決於其他字符串debugmsg價值的變化?

回答

3

確實的omit是一個特殊的變量,如果您不想向模塊提供參數,則使用該變量。
因此,如果您將arg="{{omit}}"傳遞給模塊,則相當於根本不傳遞arg
如果您想要依賴模塊的默認值,如果您的自定義參數未定義,這非常有用。
documentation中有一個例子。

  • None | default('0') | int or omitNone用於通過我這裏說明的目的)
  • '0' | int or omit
  • 0 or omit
  • omit

在您的例子{{ value_not_defined|default('0') | int or omit }}如下評價

最後一步是因爲在python boolean operations

以下值解釋爲假:假,無,所有類型的數字零,空字符串和容器

有了這個介意你的任務是這樣解釋的:

- debug: msg="{{ omit }}" 
- debug: msg="debug {{ omit }}" 

呼籲第一debug得到的無msg參數(這就是omit)和第二個debugmsg="debug __omit_place_holder..."omit這裏連接debug,因此它只是一個普通的字符串)。

如果debug模塊被調用時沒有msg參數,它會打印Hello world!