是否有Ansible可以合并的变量?
今天我注意到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是配置管理工具的危险特性 是否有
---
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