Ansible win_shell/win_command执行shutdown命令挂起问题
问题原因
shutdown /h命令触发系统休眠时,会立刻强制切断当前所有远程连接(包括Ansible依赖的WinRM连接),默认配置下Ansible会持续等待该WinRM会话的返回结果,连接被异常断开后就会一直挂起到超时时间,才会继续后续流程——本质是连接断了Ansible没收到任务返回,不是休眠命令没执行成功。
解决方案
用Ansible异步任务模式提交休眠命令,提交后直接跳过结果等待,同时加极短的命令执行缓冲避免连接断得太快导致任务提交判定失败,替换原有任务配置即可:
- name: Hibernate win_shell: 'Start-Sleep -Milliseconds 200; shutdown /h' async: 1 poll: 0 ignore_errors: true
参数说明
Start-Sleep -Milliseconds 200:给WinRM连接留200毫秒缓冲时间,确保Ansible完成任务提交动作后再触发休眠,避免连接提前中断导致任务误报失败async: 1:开启异步执行模式,给当前任务分配1秒的运行超时窗口,完全覆盖休眠命令的触发耗时poll: 0:核心配置,告诉Ansible把任务提交到目标节点后立刻推进后续流程,完全不轮询、不等待任务执行结果ignore_errors: true:兜底配置,休眠触发时WinRM连接被强制切断偶尔会抛出连接中断类报错,开启后直接忽略这类不影响实际执行结果的错误,避免playbook中断
注意:不要尝试用
win_reboot模块实现休眠,该模块逻辑是持续探测节点重启后的连通状态,不适用于休眠后不会自动唤醒的场景。
内容的提问来源于stack exchange,提问作者marafado88
相关产品推荐
相关产品推荐

