Linux

如何在ansible的不同變數文件中合併散列類型的變數?

  • October 15, 2018

我有兩個 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)

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