You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:31:24