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
相关产品推荐
相关产品推荐

