我有两个 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
首先,列表就是[1, 2, 3]
你谈论的字典{a:1, b:2, c:3}
,或者换句话说是哈希。
有可配置参数:hash_behaviour。
默认情况下是replace
,但您可以将其设置为merge
以实现所需的行为。
答案2
从 Ansible v2.0 开始你可以这样做:
- name: merging hash_a and hash_b into hash_c
set_fact: hash_c="{{ hash_a|combine(hash_b) }}"
查看更多Ansible 过滤器 - 组合哈希/字典(来自 Jinja2)