2

我正在尝试使用 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

挂载.ps1。

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

测试.ps1

Get-ChildItem K:\

卸载.ps1

Remove-PSDrive "K"
4

1 回答 1

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 个版本。

于 2016-09-06T14:00:36.760 回答