使用Ansible在Windows Guest虚拟机上映射网络驱动器

时间:2015-03-24 00:28:26

标签: windows powershell ansible winrm

我尝试使用Ansible在Windows客户端上自动执行某些任务,并且我遇到了映射网络驱动器的一些问题。

我要做的是映射驱动器,对其执行操作(在我的示例中,我只是尝试列出文件),然后取消映射。

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

运行Ansible后登录Windows guest虚拟机时,映射驱动器。

如果我在登录访客时运行Ansible,则只有在我退出并重新登录后才能看到驱动器。我用来挂载驱动器的脚本也会在guest虚拟机上创建一个文件用于调试目的,即使我已登录,该文件也会出现。我不需要注销并重新登录它变得可见。因此,似乎只有网络驱动器映射需要注销和登录才能生效。

我也试过" 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"

1 个答案:

答案 0 :(得分:3)

不幸的是,这与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次发布。 / p>