Ansible通过winrm执行NSIS静默卸载命令不生效该如何解决?
问题核心原因
- NSIS格式的卸载程序默认会拉起子进程执行实际卸载操作,父进程启动子进程后会立即退出,Ansible默认仅跟踪父进程状态,拿到返回码0时就认为任务执行完成,此时子进程要么还未执行完,要么因为WinRM会话结束被系统自动回收终止,导致实际卸载未完成。
- 卸载
C:\Program Files目录下的程序需要管理员权限,WinRM远程连接默认会受UAC限制,即使用管理员账号登录也默认持有限制令牌,没有修改系统目录的权限。
修复后的正确任务写法
- name: 静默卸载my_app win_shell: start /wait "" "C:\Program Files\my_app\Uninstall.exe" /S args: executable: cmd # 开启权限提升获取管理员权限 become: yes become_method: runas become_user: SYSTEM # 可选:增加校验逻辑确保卸载完成 register: uninstall_res retries: 3 delay: 5 until: lookup('ansible.windows.win_stat', path='C:\\Program Files\\my_app').exists == False
参数说明
start /wait "":start命令的/wait参数会等待卸载程序启动的所有子进程全部执行完成后再退出,避免父进程提前退出导致卸载逻辑中断,第一个空引号是必填的窗口标题参数,避免路径包含空格时命令解析错误。become相关配置:开启权限提升,使用SYSTEM账号执行卸载操作,避开UAC远程会话限制,确保有修改C:\Program Files目录的权限。如果SYSTEM权限执行异常,也可以替换为目标机器的本地管理员账号,同时配置become_password参数传入对应账号密码。
内容的提问来源于stack exchange,提问作者linuxfever
相关产品推荐
相关产品推荐

