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

如何在Ansible的localhost中获取workers组任意主机的变量?

解决Ansible跨Play获取run_once定义变量的问题

针对你遇到的场景,有两种简洁可行的解决方法:

方法一:直接将变量同步到localhost(推荐)

在第一个play的set_fact任务中,通过delegate_to和delegate_facts将变量直接定义在localhost上,后续localhost的play可以直接引用,无需查找具体执行主机。

修改后的第一个play任务:

- name: Some action on the workers
  hosts: workers
  gather_facts: false
  run_once: true
  tasks:
    - name: Set var for server information (sync to localhost)
      set_fact:
        server_info:
          "name": "winserver"
          "os": "Microsoft Windows Server 2019 Datacenter"
      delegate_to: localhost
      delegate_facts: true

此时第二个play无需修改,直接使用{{ server_info }}即可正常获取变量。

方法二:通过筛选hostvars动态查找

如果不想修改第一个play的逻辑,可以在localhost的play中,利用Ansible过滤器从workers组的主机变量中筛选出存在server_info的主机,再提取变量:

修改后的第二个play任务:

- name: Some action on the localhost
  hosts: localhost
  gather_facts: false
  run_once: true
  tasks:
    - name: Show script stdout
      debug:
        msg: "{{ groups['workers'] | map('extract', hostvars) | selectattr('server_info', 'defined') | first | json_query('server_info') }}"

过滤器逻辑说明:

  • groups['workers']:获取workers组的所有主机列表
  • map('extract', hostvars):将主机列表映射为对应的hostvars对象
  • selectattr('server_info', 'defined'):筛选出已定义server_info变量的主机
  • first:取第一个符合条件的主机(因为run_once只会在一台主机上定义变量)
  • json_query('server_info'):提取该主机的server_info变量

内容的提问来源于stack exchange,提问作者Tjerk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:16