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

如何在Ansible Playbook中生成主机列表并传递给Python脚本

解决Ansible收集主机列表并传递给Python脚本的问题

看起来你遇到的核心问题是Ansible的主机上下文隔离导致无法跨主机收集完整列表,以及传递给脚本时误用了复杂的任务结果结构而非纯主机列表。我来帮你梳理问题并给出可行的解决方案:

先分析你之前的错误点

测试案例1的问题

  • Ansible中每个主机的任务是独立执行的,set_fact设置的变量仅存在于当前主机的上下文里,所以每个主机的ips列表只会包含自己的inventory_hostname,根本无法合并成整个集群的列表。
  • debug任务里的var: "{{ ips }}"写法错误,正确的应该是var: ips(不需要加双花括号),这也是你看到VARIABLE IS NOT DEFINED报错的原因。

测试案例2的问题

  • 你完全没必要用with_items循环groups['all']再去register结果——因为groups['all']本身就是一个包含所有主机的原生列表!
  • 你传递给Python脚本的host_list或items是register返回的任务元数据(包含changed、msg等冗余字段),不是纯主机列表,所以脚本输出的只是复杂结构的开头片段。

正确解决方案

方案1:直接用内置groups变量传递纯主机列表

groups['all']是Ansible内置变量,直接包含所有主机的主机名/IP列表,只需把它转成空格分隔的字符串就能传递给脚本:

Playbook示例

---
- hosts: all
  become: yes
  become_user: root
  tasks:
    # 仅在有corename变量的主机上执行脚本
    - name: 传递全量主机列表给Python脚本
      script: "/home/oded/Sandbox/ansible/pyScript/test.py {{ groups['all'] | join(' ') }}"
      when: corename is defined

Python脚本优化(可选)

如果想更优雅地处理参数,脚本可以直接提取除自身路径外的所有参数作为主机列表:

#! /usr/bin/python3
import sys

# 第一个参数是脚本路径,后续参数都是主机列表
host_list = sys.argv[1:]
print("收到的主机列表:", host_list)

方案2:自定义筛选主机列表(比如按变量过滤)

如果需要收集特定属性的主机(比如带vip变量的主机),可以用map+select生成自定义列表:

---
- hosts: all
  become: yes
  become_user: root
  vars:
    # 筛选出包含vip变量的主机
    vip_hosts: "{{ groups['all'] | select('defined', hostvars[item]['vip']) | list }}"
  tasks:
    - name: 传递筛选后的主机列表
      script: "/home/oded/Sandbox/ansible/pyScript/test.py {{ vip_hosts | join(' ') }}"
      when: corename is defined

方案3:在控制节点执行脚本(避免目标主机重复执行)

如果只需要在本地运行Python脚本,无需在目标主机执行,更高效的方式是把任务放在localhost:

---
- hosts: localhost
  gather_facts: no
  tasks:
    - name: 在控制节点执行脚本,传递全量主机列表
      script: "/home/oded/Sandbox/ansible/pyScript/test.py {{ groups['all'] | join(' ') }}"

验证结果

执行上述Playbook后,Python脚本会输出完整的主机列表,比如:

收到的主机列表: ['100.126.247.167', '100.126.246.237', '100.126.246.201']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:35:48