Ansible
Ansible group_vars 變數優先級(group_vars 覆蓋其他 group_vars)
在 Ansible 2.2 上,
我有一個 Ansible 主機文件:
[webserver] aegir.dev [hostmaster] aegir.dev
我有兩個
group_vars/
文件:# group_vars/webserver.yml my_var: - vagrant
和
# group_vars/hostmaster.yml my_var: - vagrant - aegir
和劇本:
- hosts: webserver tasks: - debug: var=my_var - hosts: hostmaster tasks: - debug: var=my_var
輸出:
PLAY [webserver] *************************************************************** TASK [setup] ******************************************************************* ok: [aegir.dev] TASK [debug] ******************************************************************* ok: [aegir.dev] => { "my_var": [ "vagrant", "aegir" ] } PLAY [hostmaster] ************************************************************** TASK [setup] ******************************************************************* ok: [aegir.dev] TASK [debug] ******************************************************************* ok: [aegir.dev] => { "my_var": [ "vagrant", "aegir" ] }
為什麼兩者都
webserver
使用hostmaster
變數hostmaster.yml
?可能我沒有
group_vars
正確使用,但我該如何解決?編輯
真實的情況是我在兩個組上執行相同的角色,一個是
webserver
實際上包含 4 個通用伺服器和一個hostmaster
組是一個網路伺服器 + 相同角色上的額外配置(使用者 aegir 僅存在於 aegir.dev 而不是在其他 3 個網路伺服器上)
這個問題有點老了,但提到的問題已經存在,所以我把我的答案寫給了需要答案的人。
實際上,根據文件,Ansible 專注於主機和任務,因此組在庫存和主機匹配之外並不能真正生存。為了解決這個問題,我們需要為組的變數添加一個前綴(比如使用命名空間來避免衝突)。
# inventory/hosts.yml webservers: hosts: host1: host2: vars: webserver_my_var: ... hostmaster: hosts: host1: vars: hostmaster_my_var: ...
在劇本中,您可以安全地使用該變數。
# playbooks/main.yml - hosts: webserver tasks: - debug: var=webserver_my_var | mandatory - hosts: hostmaster tasks: - debug: var=hostmaster_my_var | mandatory
這樣您就可以安全地消除問題。
在多個組中使用相同的變數名還有另一個問題。僅通過查看庫存很難猜測變數的值,您需要知道組之間的關係以及一組與另一組的順序/優先級,這既費力又容易出錯。