Ansible多组变量定义下如何合并同名称列表变量?
问题:Ansible多组定义同一变量时如何实现内容合并?
场景复现
在group_vars/all.yml中定义基础监控服务变量及合并逻辑:
srvstatus_services_to_monitor_base: - sshd.service - vector.service srvstatus_services_to_monitor_extra: [] srvstatus_services_to_monitor: "{{ srvstatus_services_to_monitor_base + srvstatus_services_to_monitor_extra }}"
在group_vars/docker.yml中定义额外监控服务:
srvstatus_services_to_monitor_extra: - docker.service
在group_vars/nfs.yml中定义另一组额外监控服务:
srvstatus_services_to_monitor_extra: - nfs.service
inventory结构:
. └── inventory ├── group_vars │ ├── all.yml │ ├── docker.yml │ └── nfs.yml └── hosts.ini
hosts.ini内容:
[docker] server [nfs] server
执行命令ansible server -m debug -a "var=srvstatus_services_to_monitor"时,结果仅包含nfs.service及基础服务,而非docker.service和nfs.service的合并内容。
解决方案
修改group_vars/all.yml中srvstatus_services_to_monitor的定义,利用Ansible内置变量和过滤器实现多组变量自动合并:
srvstatus_services_to_monitor: "{{ srvstatus_services_to_monitor_base + (group_names | map('extract', vars, 'srvstatus_services_to_monitor_extra') | select('defined') | flatten) }}"
逻辑说明
group_names:当前主机所属的所有组名列表(此处为['docker', 'nfs'])map('extract', vars, 'srvstatus_services_to_monitor_extra'):从每个组的变量集合中提取指定的额外服务变量select('defined'):过滤掉未定义该变量的组(避免因部分组未设置变量报错)flatten:将多个组返回的列表合并为一个扁平列表- 最终与基础服务列表相加,得到完整的监控服务集合
修改后执行原debug命令,即可得到合并结果:
srvstatus_services_to_monitor: - sshd.service - vector.service - docker.service - nfs.service
该方案无需修改各组的变量定义,仅通过all.yml中的变量表达式即可自动完成多组变量合并。
内容的提问来源于stack exchange,提问作者Lud
相关产品推荐
相关产品推荐

