通过Ansible执行PowerShell脚本安装MSI软件本地正常远端运行失败
问题原因
- 路径不匹配:你将PowerShell脚本上传到了
C:/install/33312/Connect目录,但脚本内切换工作目录的路径是C:\hybrinstall\33312\Connect,两个路径不一致,如果后者不存在,后续MSI调用会直接失败。 - MSI调用方式错误:PowerShell非交互式会话中未加载.msi文件的默认关联程序,直接用相对路径调用
.\\installer.msi无法触发安装流程,需显式调用msiexec.exe执行安装包。 - 权限上下文配置错误:Ansible针对Windows节点的
become默认未指定runas方法,且WinRM默认传输协议的会话权限受限,无法满足系统级MSI安装的权限要求。 - 工作目录不稳定:Ansible执行
win_shell时默认工作目录不是脚本所在目录,相对路径的日志和安装包调用会出现找不到文件的问题。
解决方案
1. 修正PowerShell安装脚本
替换installconnect.ps1内容为如下版本,全部使用绝对路径,显式调用msiexec并等待安装完成:
$installRoot = "C:\install\33312\Connect" # 确保工作目录存在 if (-not (Test-Path $installRoot)) { New-Item -ItemType Directory -Path $installRoot -Force | Out-Null } # 显式调用msiexec执行安装,全路径指定安装包和日志文件 $installProc = Start-Process msiexec.exe -ArgumentList "/i `"$installRoot\installer.msi`" /q /l*v `"$installRoot\install_log.txt`"" -Wait -NoNewWindow -PassThru # 输出安装退出码,方便Ansible排查问题 exit $installProc.ExitCode
2. 修正Ansible Playbook配置
调整become参数和WinRM传输协议,明确文件上传路径:
--- - hosts: wins vars: # 配置Windows提权方式为runas ansible_become_method: runas ansible_become_user: Administrator # 用CredSSP传输协议获得完整系统权限 ansible_winrm_transport: credssp tasks: # 可选:提前同步MSI安装包到目标节点,如果节点上已经有可以跳过 - name: 同步MSI安装包 win_copy: src: /etc/ansible/installer.msi dest: 'C:\install\33312\Connect\installer.msi' - name: 同步安装脚本 win_copy: src: /etc/ansible/installconnect.ps1 dest: 'C:\install\33312\Connect\installconnect.ps1' - name: 执行安装流程 win_shell: C:\install\33312\Connect\installconnect.ps1 become: yes
3. 额外检查项
- 确认目标Windows节点的PowerShell执行策略允许运行自定义脚本,可在Playbook中新增任务配置:
- name: 设置PowerShell执行策略 win_shell: Set-ExecutionPolicy RemoteSigned -Force become: yes - 安装完成后可到目标节点的
C:\install\33312\Connect\install_log.txt查看安装日志排查异常。
内容的提问来源于stack exchange,提问作者ANANTH AYYASWAMY
相关产品推荐
相关产品推荐

