Ansible:不通过继承获取主机所属组的变量信息
实现Ansible多组变量汇总为列表
方法一:直接通过groupvars指定分组提取变量
Ansible原生支持通过groupvars[组名]直接访问对应分组的原始变量值,不会被后续分组的覆盖值影响。你可以直接指定需要汇总的组,将它们的foo值组合成列表:
- name: 汇总指定组的foo变量为foo_list hosts: wibble vars: foo_list: - "{{ groupvars['a']['foo'] }}" - "{{ groupvars['b']['foo'] }}" - "{{ groupvars['c']['foo'] }}" tasks: - name: 输出汇总结果 debug: var: foo_list
这种方式适合明确知道需要汇总的组名的场景,直接明了。
方法二:自动遍历主机所属所有组提取变量
如果需要自动识别主机所属的所有组,并收集其中定义了foo变量的值,可以通过变量过滤实现:
- name: 自动汇总所有含foo变量的组值为foo_list hosts: wibble vars: foo_list: "{{ groups | select('in', hostvars[inventory_hostname]['groups']) | map('extract', groupvars, 'foo') | select('defined') | list }}" tasks: - name: 输出汇总结果 debug: var: foo_list
表达式说明:
groups:Ansible内置变量,包含清单中所有组的列表select('in', hostvars[inventory_hostname]['groups']):筛选出当前主机(wibble)所属的所有组map('extract', groupvars, 'foo'):从每个组的groupvars中提取foo变量select('defined'):过滤掉未定义foo变量的组(比如d、e、f组)list:将结果转换为列表
替代方案:使用带组名前缀的变量汇总
如果不想依赖groupvars,可以修改组变量的命名规则,给每个组的变量加上组名前缀,再统一汇总:
修改后的组变量文件:
# group_vars/a.yml foo_a: 1
# group_vars/b.yml foo_b: 2
# group_vars/c.yml foo_c: 3
然后在playbook中筛选并汇总:
- name: 汇总带前缀的foo变量为foo_list hosts: wibble vars: foo_list: "{{ vars | dict2items | selectattr('key', 'match', '^foo_') | map(attribute='value') | list }}" tasks: - name: 输出汇总结果 debug: var: foo_list
以上三种方法都能满足需求,根据你的实际场景选择即可,foo_list的顺序可根据需求调整(你提到顺序无关紧要,无需额外处理)。
内容的提问来源于stack exchange,提问作者Christopher Causer
相关产品推荐
相关产品推荐

