Ansible Playbook如何在Windows虚拟机执行指定PowerShell脚本
Ansible Playbook 运行PowerShell脚本实现方案
前置检查
- 控制节点安装所需集合:执行命令
ansible-galaxy collection install ansible.windows完成安装 - 目标Windows主机提前配置好WinRM服务,执行
ansible <你的Windows主机组名> -m win_ping验证连通性正常 - 确认目标机路径权限正常:
C:\pts目录存在且可写,F:\pts\reconfigure.bat路径可访问
可直接运行的Playbook示例
--- - name: Windows节点执行部署脚本 hosts: windows_servers # 替换为你Inventory中配置的Windows主机组名称 gather_facts: false vars: # *敏感凭据*建议用ansible-vault加密存储,不要明文硬编码 share_username: "文件服务器访问用户名" share_password: "文件服务器访问密码" tasks: - name: 执行内嵌PowerShell逻辑 ansible.windows.win_powershell: script: | # 映射文件服务器网络盘 $net = New-Object -ComObject WScript.Network $net.MapNetworkDrive("X:", "\\fileserver", $true, $env:SHR_USER, $env:SHR_PASS) # 递归拷贝共享盘文件到本地脚本目录 Copy-Item "X:\*" -Destination C:\scripts -Recurse -Force # 读取用户信息匹配对应域名 $GenericPath = "C:\pts\Install.bat" $name = Get-Content C:\pts\file.txt -Raw $pos = $name.IndexOf("@") $User = $name.Substring(0, $pos) $Domain = switch -Wildcard ($name) { '*dom1.al.com*' { "al" } '*dom2.al.com*' { "al2" } '*dom3.al.com*' { "al3" } '*dom4.al.com*' { "al4" } } # 替换批处理文件中的用户占位符 $ReplaceUser = "$Domain\$User" (Get-Content $GenericPath) | ForEach-Object { $_ -replace "ReplaceUser", $ReplaceUser } | Set-Content $GenericPath -Encoding ASCII # 执行重配置脚本,等待执行完成后返回结果 Start-Process -FilePath "F:\pts\reconfigure.bat" -Wait -NoNewWindow # 通过环境变量注入凭据,避免脚本明文硬编码敏感信息 environment: SHR_USER: "{{ share_username }}" SHR_PASS: "{{ share_password }}" # 提权到SYSTEM身份运行,解决WinRM双跳无法访问网络共享的问题 become: true become_method: runas become_user: SYSTEM register: ps_exec_result - name: 输出PowerShell执行结果用于排查 ansible.builtin.debug: var: ps_exec_result
关键配置说明
- 开启
become相关配置提权到本地SYSTEM账户运行,无需额外配置CredSSP认证即可解决WinRM双跳问题——WinRM会话默认无法跨节点访问网络共享的限制,是映射网络驱动器场景最简便的配置方式 - 文件服务器访问凭据通过Ansible变量传入,以环境变量形式注入PowerShell执行上下文,避免明文写在脚本内容中造成泄露,生产环境请配合
ansible-vault加密敏感变量 - 执行批处理脚本时添加
-Wait参数,会等待批处理执行完成后再返回Ansible任务结果,避免任务提前返回导致后续逻辑顺序异常 - 写入批处理文件时指定
-Encoding ASCII,避免PowerShell默认使用UTF-16编码写入导致批处理运行时出现乱码报错 - 原脚本中多段if域名判断替换为switch匹配,逻辑更简洁,执行效率更高
常见报错排查
- 提示网络路径不可达:检查文件服务器共享目录权限,确认SYSTEM账户有权限访问对应共享,也可将
become_user替换为目标机上有权限访问共享的本地用户 - 文件替换不生效:检查
C:\pts\Install.bat是否带有只读属性,可在脚本中添加attrib.exe -R C:\pts\Install.bat命令提前移除只读属性 - 批处理执行失败:查看debug输出的
ps_exec_result字段中的output、error信息,可直接拿到PowerShell和批处理的原始报错内容定位问题
内容的提问来源于stack exchange,提问作者messi
相关产品推荐
相关产品推荐

