Ansible

Ansible group_vars 變數優先級(group_vars 覆蓋其他 group_vars)

  • May 17, 2021

在 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

這樣您就可以安全地消除問題。

在多個組中使用相同的變數名還有另一個問題。僅通過查看庫存很難猜測變數的值,您需要知道組之間的關係以及一組與另一組的順序/優先級,這既費力又容易出錯。

引用自:https://serverfault.com/questions/816126