【问题标题】:Mapping a Network Drive on a Windows Guest using Ansible使用 Ansible 在 Windows 客户机上映射网络驱动器
【发布时间】:2025-12-26 14:10:16
【问题描述】:

我正在尝试使用 Ansible 在 Windows 客户机上自动执行一些任务,但在映射网络驱动器时遇到了一些问题。

我要做的是映射驱动器,对其做一些事情(在我的示例中,我只是尝试列出文件),然后取消映射它。

当我运行 Ansible 时,输出表明共享驱动器已成功映射,但列出文件和取消映射都会导致错误,指出驱动器不存在。 (“名为“K”的驱动器不存在。”)

当我在运行 Ansible 后登录到 Windows 客户机时,驱动器被映射。

如果我在来宾登录时运行 Ansible,则驱动器仅在我注销并重新登录后才可见。我用来挂载驱动器的脚本还会在来宾上创建一个文件以进行调试,即使我登录该文件也会出现。我不需要注销并再次登录以使其可见。所以看来只有网盘映射需要注销登录才能生效。

我也试过“net use”来映射驱动,结果还是一样。

我的 Ansible 剧本看起来像这样。 (我省略了一些敏感部分。)

  tasks:
      - name: Mount share
        script: scripts/mount.ps1 {{ share }}
      - name: Test
        script: scripts/test.ps1
        register: test
      - name: Test stdout
        debug: msg="{{ test.stdout }}"
      - name: Test stderr
        debug: msg="{{ test.stderr }}"
      - name: Umount share
        script: scripts/umount.ps1

mount.ps1.

param([string]$share)
$share | Out-File c:\ansible-test\debug.txt
New-PSDrive -Name "K" -PSProvider FileSystem -Root "$share" -Persist

test.ps1

Get-ChildItem K:\

umount.ps1

Remove-PSDrive "K"

【问题讨论】:

  • 如果我将 ps1 脚本合并为一个,它可以工作。

标签: windows powershell ansible winrm


【解决方案1】:

不幸的是,这是 Ansible 与 Windows 通信的方式。我遇到过类似的问题,命令和包安装没有按预期工作。

当 Ansible 通过 WinRM 与 windows 框进行通信时,它会启动一个批处理连接,而不是一个完整的会话。映射驱动器是需要完整会话的任务之一,但是 Ansible 运行的每个任务都会创建它自己的批处理连接,因此当您在断开连接时立即映射驱动器时,您会丢失该映射,因为也没有实际用户来注册它.

这里唯一的解决方法是创建一个 .ps1 来映射驱动器,然后使用 Invoke-Command。

这是我的工作:

- name: map drive and run a task
  script: files/mapdrive.ps1 -network_password "{{ network_password }" -command_to_run "{ Copy-Item Y:\file_to_copy.txt C:\Some\Were }"

我的 ps1 看起来像这样:

param(
  $network_password,
  $command_to_run
)
$PWord = ConvertTo-SecureString $network_password -AsPlainText -Force
$myCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "domain\user",$PWord
New-PSDrive -Name "Y" -PSProvider "FileSystem" -Root "\\remoteserver\share" -Credential $myCreds
Invoke-Command -ScriptBlock $command_to_run

显然,Ansible 的未来版本将采用一种“成为”形式,这将允许这些持续会话使此类任务变得更加容易,但这可能需要几年时间,并且至少会发布 2 或 3 个版本。

【讨论】: