Ansible 控制节点 Windows 限制说明 | AI生成和翻译

Home 2025.12

问题:为什么Ansible控制节点不能在Windows上运行,os.set_blocking在此中扮演什么角色?

答案:

Ansible的控制节点(你运行ansibleansible-playbook的机器)不支持在Windows上运行,这是因为Python的行为以及Ansible核心代码中对Unix/POSIX的假设存在根本性的技术原因。最常被引用的具体障碍是使用了低级别的文件描述符函数,例如os.set_blocking()

Windows不被支持的主要原因

  1. os.set_blocking()仅限Unix
    在多个地方(尤其是在Ansible的连接插件和进程处理中),Ansible会调用:
    os.set_blocking(fd, False) # 使管道或套接字变为非阻塞
    

    这个函数在Windows上不存在——它是Python 3.5+中仅在类Unix系统上添加的POSIX特定方法。在Windows上尝试调用它会引发AttributeError
    这在Ansible的ansible-connection进程和persistent connection逻辑中被大量使用。

  2. 严重依赖fork()
    Ansible历史上广泛使用os.fork()(尤其是在“策略”插件完全守护化之前)。Windows没有原生的fork(),只有有限的subprocess替代方案,这些方案要慢得多并且行为不同。

  3. POSIX路径、信号、伪终端(pty)和/dev/
    • 许多模块期望/bin/sh/usr/bin/python等。
    • 代码使用os.kill()signal.SIGTERMpty.fork()等。
    • Windows直到最近才缺乏真正的pty实现(Windows 10+有“ConPTY” API,但Ansible不使用它)。
  4. Shebang和可执行文件假设
    几乎所有的Ansible模块都使用#!/usr/bin/python#!/bin/bash的shebang,而Windows无法原生解释这些。

  5. Windows Subsystem for Linux (WSL) 也不受官方支持
    尽管许多人成功地在WSL/WSL2中运行Ansible,但Red Hat/Ansible并未官方支持或测试它,原因在于进程处理、文件描述符行为和偶尔的死锁等方面的细微差异。

当前官方状态(截至2025年的Ansible 10.x / ansible-core 2.17+)

人们使用的变通方法

简而言之:导致Windows上立即出现导入/崩溃错误的直接技术障碍是os.set_blocking(),但真正的原因要深刻得多——Ansible从一开始就是基于POSIX环境构建的。


Back

x-ai/grok-4.1-fast

Donate