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

Windows主机Ansible异步执行Playbook报grp模块缺失错误求助

问题解决:Windows主机Ansible异步执行报错ModuleNotFoundError: No module named 'grp'

一、报错原因及解决方法

这个错误是因为Ansible的异步任务逻辑中默认依赖了Unix系统专属的grp模块,但Windows系统不存在该模块,导致执行失败。有两种直接解决途径:

1. 升级Ansible版本

Ansible 2.10及以上版本已经修复了Windows异步任务对grp模块的不必要依赖,升级到最新稳定版即可彻底解决问题。

2. 临时修补(不升级场景)

如果无法升级Ansible,可手动修改异步任务处理代码:

  • 找到Ansible安装目录下的async_wrapper.py文件(通常路径为lib/ansible/modules/async_wrapper.py)
  • 注释或删除文件中导入grp模块的代码,以及所有调用grp模块的逻辑。注意:此方法属于临时hack,仅建议在Windows专属的Ansible环境中使用,避免影响Unix主机的异步任务。

二、无需依赖异步模块的长脚本执行替代方案

如果不想依赖Ansible原生async机制,可采用以下两种稳定方案实现Windows后台执行长脚本:

方案1:通过Windows计划任务执行

创建一次性计划任务,让系统独立会话执行脚本,不受Ansible会话终止影响:

- name: 创建一次性计划任务执行长脚本
  win_scheduled_task:
    name: LongRunningTask
    description: 后台执行长时间运行脚本
    actions:
      - path: powershell.exe
        arguments: "-File C:\\scripts\\long_running_script.ps1"
    triggers:
      - type: once
        start_boundary: "{{ ansible_date_time.iso8601 }}"
    state: present
    enabled: yes
    run_level: highest
    username: SYSTEM  # 用系统账户执行,避免用户会话结束终止进程

- name: 轮询等待任务完成
  win_scheduled_task_info:
    name: LongRunningTask
  register: task_status
  until: task_status.state == 'ready'  # 任务执行完成后状态变为ready
  retries: 600  # 对应10小时(每60秒重试一次)
  delay: 60

- name: 清理计划任务
  win_scheduled_task:
    name: LongRunningTask
    state: absent

方案2:用nssm将脚本注册为临时服务

nssm(Non-Sucking Service Manager)可将任意脚本转为Windows服务,服务独立运行,不受Ansible会话影响:

- name: 下载nssm到临时目录
  win_get_url:
    url: https://nssm.cc/release/nssm-2.24.zip
    dest: C:\temp\nssm.zip

- name: 解压nssm
  win_unzip:
    src: C:\temp\nssm.zip
    dest: C:\temp\nssm
    creates: C:\temp\nssm\win64\nssm.exe

- name: 注册脚本为临时服务并启动
  win_shell: |
    C:\temp\nssm\win64\nssm.exe install LongRunningService powershell.exe "-File C:\\scripts\\long_running_script.ps1"
    C:\temp\nssm\win64\nssm.exe start LongRunningService

- name: 轮询等待服务停止(脚本执行完成)
  win_service:
    name: LongRunningService
  register: service_status
  until: service_status.state == 'stopped'
  retries: 600
  delay: 60

- name: 清理临时服务和nssm文件
  win_shell: |
    C:\temp\nssm\win64\nssm.exe remove LongRunningService confirm
    Remove-Item -Path C:\temp\nssm -Recurse -Force
    Remove-Item -Path C:\temp\nssm.zip -Force

关于你之前的PowerShell进程终止问题

你之前用Start-Process的方式,是在Ansible临时会话中创建子进程,当win_shell任务结束时,Ansible会关闭该会话,所有关联子进程也会被强制终止。而计划任务或服务是独立于Ansible会话的系统级进程,因此不会被终止。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:58:12