Linux
如何在ansible的不同變數文件中合併散列類型的變數?
我有兩個 YAML 變數文件,可用於許多劇本:
# playbook/group_vars/all settings: a: 1 b: 2 # inventory/group_vars/main.yml settings: c: 3
我想在我的劇本
settings
中平等。{ a: 1, b: 2, c: 3 }
相反,它等於
{ c: 3 }
因為inventory/group_vars/*
具有更高的優先級,playbook/group_vars/all
並且因為雜湊被覆蓋,而不是合併。我看到以下選項:
- 單獨定義變數,使用命名約定和前綴,而不是使用雜湊,如下所示:
# playbook/group_vars/all settings_a: 1 settings_b: 2 # inventory/group_vars/main.yml settings_c: 3
我們的團隊認為這個解決方案不夠優雅。
- 使用 set_fact 和/或 Jinja 的“+”運算符
{{ list_common + list_specific }}
這需要對許多劇本進行更改(我們確實有很多),而且看起來也很糟糕。
–
是否有其他選項可以合併來自不同文件的雜湊而不是重新定義(覆蓋)它們?
我們試圖實現的是停止跨變數文件重複列表,並僅定義特定於組/主機的那些參數。
首先,列表是
[1, 2, 3]
和您談論字典{a:1, b:2, c:3}
或換句話說雜湊。有可配置的參數:hash_behaviour。
預設情況下它是
replace
,但您可以將其設置merge
為實現所需的行為。
從 Ansible v2.0 開始,您可以這樣做:
- name: merging hash_a and hash_b into hash_c set_fact: hash_c="{{ hash_a|combine(hash_b) }}"
在Ansible 過濾器下查看更多資訊 - 組合雜湊/字典(來自 Jinja2)