2015-07-02 52 views
2

我想充分利用變量優先級。Ansible - 當主機相同時,變量優先級失敗

那麼,讓我們來看看這個簡單的項目:

├── group_vars 
│ └── all 
│ └── web 
├── hosts 
│ └── local 
└── site.yml 

清單文件hosts/local

[local_web] 
192.168.1.20 

[local_db] 
192.168.1.20 

[web:children] 
local_web 

[db:children] 
local_db 

group_vars/all文件:

test: ALL 

group_vars/web文件:

test: WEB 

site.yml文件:

--- 
- name: Test 
    hosts: db 
    tasks: 
    - debug: var=test 

好了,所以這只是測試變量的優先級。當我在db組中運行ansible時,test變量應顯示「ALL」,因爲只能看到group_vars/all,對吧? 錯誤:

TASK: [debug var=test] ******************************************************** 
ok: [192.168.1.20] => { 
    "var": { 
     "test": "WEB" 
    } 
} 

其實,如果local_weblocal_db主機不同,那麼它的工作原理。

當主機相同時,爲什麼ansible仍會查看不相關的配置文件?這是一個錯誤還是隻是我?

+0

Ansible除了擁有這種令人厭煩的行爲外很棒。我看到它的方式,主機也是變量。爲什麼變量值會影響變量的優先級? – garbagecollector

回答

3

你在說明192.168.1.20是你定義的所有組中的4個組的成員,這與你在劇本中引用主機的方式無關。無論您如何在劇本中引用主機,Ansible都會評估主機所在的組並根據這些組導入變量。

這裏有一個方便的測試來證明這一點:

- name: Test 
    hosts: db 
    tasks: 
    - debug: msg="{{ inventory_hostname }} is in group {{ item }}" 
    when: inventory_hostname in groups[item] 
    with_items: group_names 

的這個輸出是:

TASK: [debug msg="host is in group {{ item }}"]  ******************************* 
ok: [192.168.1.20] => (item=db) => { 
    "item": "db", 
    "msg": "192.168.1.20 is in group db" 
} 
ok: [192.168.1.20] => (item=local_db) => { 
    "item": "local_db", 
    "msg": "192.168.1.20 is in group local_db" 
} 
ok: [192.168.1.20] => (item=local_web) => { 
    "item": "local_web", 
    "msg": "192.168.1.20 is in group local_web" 
} 
ok: [192.168.1.20] => (item=web) => { 
    "item": "web", 
    "msg": "192.168.1.20 is in group web" 
} 

由於主機是web組中則web group_vars文件被列入。

+0

因此,我明白,在**看團隊之前,主持**看起來很有道理。在這種情況下,它會看到主機192.168.1.20,並且由於它位於所有組中,它會加載所有配置文件。是對的嗎?那麼,在這種情況下,是否有辦法組織庫存文件以便能夠加載web配置文件?現在我明白它是如何工作的,但它的方式看起來不夠。我的意思是,用這個例子我說「192.168.1.20是所有4的成員」,但是有兩個不同的主機,它不再是真的了...... –

+0

如果你想包括變量之外的變量Ansible隱式包含它們,那麼你應該看看[include_vars](http://docs.ansible.com/include_vars_module.html)任務。使用這個(也許是一些自定義'when'邏輯等等),你可以定製事實/變量的使用方式。 –

1

@Bruce P答案是對的。

但是,這種不可行的行爲對我來說並不令人滿意,因爲它根據主機改變了可變優先級。而不是group_vars,我使用vars_files字典。

我將group_vars移動到名爲vars的目錄中。

更新site.yml

--- 
- name: Test 
    hosts: db 
    tasks: 
    - debug: var=test 
    vars_files: 
    - vars/all 
    - vars/db 

現在,test顯示「ALL」,因爲我想。它首先讀取vars/all,然後vars/db(這是空的)。

(注:變量優先似乎有點buggy的時刻 - v1.9.2的 - 這意味着,如果你使用的變量var中的文件名,ansible不會在預期的順序加載文件。)

0

另一種可以在group_vars中保留變量的解決方案是用兩個文件(hosts/inv_db和hosts/inv_web)替換庫存文件hosts/local,並使用-i選項指定要使用的庫存文件。