如何在 ansible 中合并不同变量文件中的哈希类型变量?

如何在 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

首先,列表就是[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)

相关内容