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

是否有Ansible可以合并的变量?,ansible,ansible-facts,Ansible,Ansible Facts,今天我注意到Ansible不会合并变量 例如,当我有 --- lvm_roles: postgresql: size: '10g' path: '/var/lib/postgresql' 例如,在另一个地方 --- lvm_roles: sonarqube: size: '10g' path: '/opt/sonarqube' Ansible不会合并这些事实。我不确定优先顺序,但我认为第一个赢了。没有错误或警告。IMHO是配置管理工具的危险特性 是否有

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

例如,当我有

---
lvm_roles:
  postgresql:
    size: '10g'
    path: '/var/lib/postgresql'
例如,在另一个地方

---
lvm_roles:
  sonarqube:
    size: '10g'
    path: '/opt/sonarqube'
Ansible不会合并这些事实。我不确定优先顺序,但我认为第一个赢了。没有错误或警告。IMHO是配置管理工具的危险特性

是否有Ansible可以合并的变量?列表和散列将不起作用。有什么解决办法吗

这是Ansible的一个显著缺点。因为“事实”可能取决于您准备的内容。由于无法合并“事实”,因此有必要硬编码和复制您不希望配置的内容

例如,当我创建一个带有

lvm_roles:
  postgresql:
    size: '10g'
    path: '{{ postgresql_home }}'
  sonarqube:
    size: '10g'
    path: '{{ sonar_home }}'
这将不起作用,因为de postgresql节点上未定义
sonar\u home
。在sonarqube节点上,未定义
postgresql\u home
。如果无法合并,则灵活使用变量的能力会受到很大影响

a的提取:

因此,您可以通过设置
hash\u behavior=merge
来更改此行为

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


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

您只需使用组变量即可。postgres服务器组上的PostgreSQL变量和Sonarqube服务器组上的Sonarqube变量。
# 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