使用ansible

时间:2017-11-28 16:59:58

标签: windows powershell ansible winrm

我想使用本地用户登录Windows服务器,然后使用Active Directory用户映射网络驱动器,并使用Ansible自动运行安装程序。

我按照this question的建议创建了PowerShell脚本并执行安装和安装。我使用该脚本如下:

清单:

[winserver]
windows

[winserver:vars]
ansible_user="local_user"
ansible_password="P@ssw0rd"
ansible_connection="winrm"
ansible_winrm_cert_validation=ignore
win_user="domain\aduser"
win_pass="P@55w0rd"

任务yaml:

---
  - name: Mount and run a script
    script: 'files/maprun.ps1 -map_user {{ win_user }} -map_password {{ win_pass }} -script z:\ascript.ps1'

maprun.ps1脚本包含以下内容:

param(
  $map_user,
  $map_password,
  $script
)
$PWord="$map_password"|ConvertTo-SecureString -AsPlainText -Force
$myCreds=New-Object System.Management.Automation.PsCredential($map_user,$PWord)
New-PSDrive -Name "Z" -PSProvider "FileSystem" -Root "\\domain\share" -Credential $myCreds
echo Invoke-Command -ScriptBlock $script

我收到错误:

New-PSDrive: A specified logon session does not exist. It may already have
been terminated

大多数点击都会谈到双跳问题,但我试图在远程脚本中指定不同的凭据,因此这不是双跃点问题。另一个答案表明这应该是可能的。该脚本以交互模式工作,因此它与批处理模式有关。我有什么想法可以让它发挥作用吗?

我在Red Hat Enterprise Linux上使用Ansible 2.3.1.0。 Windows是Windows Server 2012 R2。脚本是手动输入的,对不起打字错误。

1 个答案:

答案 0 :(得分:-2)

我可以提出一些建议。

  1. 正如您所写,脚本" maprun.ps1"必须保存在"文件中#34; Linux控制器计算机的目录。如果是,那么" maprun.ps1"脚本将被Ansible复制到远程主机,执行和删除。如果" maprun.ps1"打算打电话给#34; ascript.ps1"你需要复制" ascript.ps1"在调用" maprun.ps1"之前到远程主机并在" maprun.ps1"的上下文中定义它的位置。
  2. 你不需要在你的剧本"脚本中的args之前需要参数名称:"命令。
  3. 你的Ansible playbook内部的Args需要双花括号和引号。
  4. 作为使用New-PSDrive命令连接到网络驱动器的替代方法,您可以尝试使用" net use"命令如下所示。
  5. 所以而不是

     script: 'files/maprun.ps1 -map_user {{ win_user }} -map_password {{ win_pass }} -script z:\ascript.ps1'
    

    尝试

      script: files/maprun.ps1 "Z:" "{{ win_user }}" "{{ win_pass }}" "z:\ascript.ps1"
    

    maprun.ps1包含以下内容......

    # connect to a shared resource and run script
    param(
        [string]$map_server,    
        [string]$map_user,
        [string]$map_password,
        [string]$script    
    )
    # connect to the network drive
    net use $map_server $map_password /USER:$map_user
    Invoke-Item (start powershell ((Split-Path $MyInvocation.InvocationName) + $script))
    net use $uncServer /delete