2017-09-19 54 views
0

我試圖「只打印/顯示」現有的變量。變量名稱是動態的。問題在於Ansible不評估when:聲明中的varibale名稱。因此我無法獲得when: (item.1 + '_wwn_' + item.0) is defined正常工作。Ansible在條件語句之前評估變量

播放:

--- 
- hosts: 127.0.0.1 

    vars: 
    host_name: ['COM01ESX07', 'COM01ESX88'] 
    COM01ESX07_wwn_2: "This exist" 

    tasks: 
    - debug: 
     var: "{{item.1}}_wwn_{{item.0}}" 
     when: (item.1 + '_wwn_' + item.0) is defined 
     with_nested: 
     - ['1', '2'] 
     - "{{host_name}}" 

不幸的是這deplays所有varaibles eventhough他們沒有定義

TASK [debug] ******************************************************************************************************************************************************************* 
ok: [127.0.0.1] => (item=[u'1', u'COM01ESX07']) => { 
    "COM01ESX07_wwn_1": "VARIABLE IS NOT DEFINED!", 
    "item": [ 
     "1", 
     "COM01ESX07" 
    ] 
} 
ok: [127.0.0.1] => (item=[u'1', u'COM01ESX88']) => { 
    "COM01ESX88_wwn_1": "VARIABLE IS NOT DEFINED!", 
    "item": [ 
     "1", 
     "COM01ESX88" 
    ] 
} 
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX07']) => { 
    "COM01ESX07_wwn_2": "This exist", 
    "item": [ 
     "2", 
     "COM01ESX07" 
    ] 
} 
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX88']) => { 
    "COM01ESX88_wwn_2": "VARIABLE IS NOT DEFINED!", 
    "item": [ 
     "2", 
     "COM01ESX88" 
    ] 
} 

但是如果我的時替換:when: ({{item.1 + '_wwn_' + item.0}}) is defined

它w ^帶病上班,雖然我會得到worning消息:

TASK [debug] ******************************************************************************************************************************************************************* 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ({{item.1 + '_wwn_' + item.0}}) is defined 

skipping: [127.0.0.1] => (item=[u'1', u'COM01ESX07']) 
skipping: [127.0.0.1] => (item=[u'1', u'COM01ESX88']) 
ok: [127.0.0.1] => (item=[u'2', u'COM01ESX07']) => { 
    "COM01ESX07_wwn_2": "This exist", 
    "item": [ 
     "2", 
     "COM01ESX07" 
    ] 
} 
skipping: [127.0.0.1] => (item=[u'2', u'COM01ESX88']) 

問題: 我怎樣才能避免worning消息,仍然僅處理現有varaiables。

+0

更有趣的問題是:爲什麼你的解決方法正在工作...... – techraf

回答

0

問題出在您的when條件。當你寫...

when: (item.1 + '_wwn_' + item.0) is defined 

......圓括號中的部分只是字符串連接,並且它都評估爲一個字符串。這完全像你這樣寫:

when: "something" is defined 

也就是說,它會永遠是真實的。你正在嘗試使用動態變量名稱,這很棘手。有關此主題的網站上有一個FAQ。基本上,你必須明確地引用hostvars頂層變量(所以你可以使用你已經構建爲一個字典的鍵字符串),所以你的任務看起來像:

--- 
- hosts: localhost 
    gather_facts: false 
    vars: 
    host_name: foo 
    tasks: 
    - set_fact: 
     foo_wwn_1: wwn1 

    - debug: 
     var: "{{item.1}}_wwn_{{item.0}}" 
     when: hostvars[inventory_hostname][item.1 + '_wwn_' + item.0] is defined 
     with_nested: 
     - ['1', '2'] 
     - "{{host_name}}"