You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:48:31