是否有 Ansible 可以合并的变量?

Are there any vars that Ansible can merge?

今天我注意到 Ansible 不会合并变量。

例如,当我有类似

的东西时
---
lvm_roles:
  postgresql:
    size: '10g'
    path: '/var/lib/postgresql'

在另一个地方我有

---
lvm_roles:
  sonarqube:
    size: '10g'
    path: '/opt/sonarqube'

Ansible 不会合并这些事实。我不确定优先顺序,但我认为第一个获胜。没有错误或警告。恕我直言,这是配置管理工具的一个危险特性。

是否有 Ansible 可以合并的变量?列表和散列将不起作用。是否有某种解决方法?

这是Ansible的一大缺点。因为 "facts" 可能取决于您要配置的内容。无法合并 "facts" 使得有必要对您不想配置的内容进行硬编码和复制。

例如,当我用

创建一个文件时
lvm_roles:
  postgresql:
    size: '10g'
    path: '{{ postgresql_home }}'
  sonarqube:
    size: '10g'
    path: '{{ sonar_home }}'

这将不起作用,因为 sonar_home 未在 de postgresql 节点上定义。在 sonarqube 节点上,postgresql_home 未定义。如果无法合并,灵活使用 vars 的能力将受到很大影响。

摘录default ansible.cfg file

# if inventory variables overlap, does the higher precedence one win
# or are hash values merged together?  The default is 'replace' but
# this can also be set to 'merge'.
#hash_behaviour = replace

因此,您可以通过设置 hash_behaviour = merge 来更改此行为。

我不会在系统范围内更改它,因为它可能会破坏其他依赖默认行为的 projects/roles。您可以在真正需要它的特定项目的根目录下分发 ansible.cfg

同时,正如@dgw 在一个具体示例中指出的那样,我始终能够通过仔细选择变量的放置位置(清单中的组或主机、包含的文件、剧本...)来保持默认行为。 ) 并最终在需要时自行合并它们。