Ansible Tower 将参数传递给 powershell 脚本

Ansible Tower pass parameter to powershell script

提问人:Daniel Zamloot 提问时间:6/24/2023 更新时间:6/26/2023 访问量:264

问:

我正在尝试将 ansible 变量作为参数传递给我的 powershell 脚本。当它们被成功传递时,我的文件的路径被缩短了。例如,当传递字符串“/Microsoft SQL Server/files/blah”并在代码中打印它时,它将变为“/Microsoft”。

这是我的剧本文件:

- name: Deploy Report
  hosts: ******
  tasks:
    - name: Run Powershell Script
      script: "../deploy.ps1 -input1 '{{ input1 }}'"
      args: 
        executable: powershell
 

非常感谢任何帮助

PowerShell 参数 传递 ansible-tower

评论


答:

0赞 Daniel Zamloot 6/24/2023 #1

该问题可能与正在使用的脚本模块有关,因为它没有参数选项。win_powershell 模块可能是一个更好的选择,因为它提供参数传递。

此外,如果要继续使用脚本模块,可以执行解决方法,因为路径名中的空格会引起问题。编辑您的 playbook 文件,如下所示:

- name: Deploy Report
  hosts: ******
  gather_facts: false
  vars:
    input1fix: "{{ input1 | regex_replace(' ', '*') }}"
  tasks:
    - name: Run Powershell Script
    script: "../deploy.ps1 -input1 '{{ input1fix }}'"
    args: 
      executable: powershell

这将使变量变为“/MicrosoftSQLServer/files/blah”

然后,可以将此行添加到 powershell 脚本以将其转换回来:

$input1 = $input1 -replace '\*', ' '
2赞 mklement0 6/24/2023 #2

从 Ansible 脚本模块的文档来看(并且您已经确认是正确的):

  • 给定的脚本及其参数通过 shell 执行。

  • 在 Windows 上,该 shell 似乎是 PowerShell(powershell.exe,Windows PowerShell CLI),并且该属性后面的内容似乎传递给 () 参数。script:-Command-c

    • 此参数将其参数解释为任意 PowerShell 代码,因此根据 PowerShell 的语法规则进行处理。
    • 顺便说一句:这意味着您不仅限于调用脚本文件,并且可以传递多个命令,以;

因此,无需指定 executable: 参数即可在 Windows 上执行 PowerShell 脚本,以下内容就足够了(请注意,我使用的是模块的 FCQN(完全限定集合名称),而不是文档中建议的短名称):ansible.builtin.scriptscript:

- name: Deploy Report
  hosts: ******
  tasks:
    - name: Run Powershell Script
      ansible.builtin.script: "../deploy.ps1 -input1 '{{ input1 }}'"

至于你试过的

通过在 下指定为参数,最终嵌套了两个 PowerShell 实例:一个隐用于执行,另一个是式调用的实例。powershellexecutable:args:

  • 请注意,在调用中的命令之前既不指定 () 也不指定 () 意味着-Command-c-File-fpowershell.exe -Command (-c)

这种嵌套不仅是不必要的,而且会导致命令行中引用的有效丢失,这解释了您的症状。'...'script:

下面的示例演示了这一点 - 从交互式会话运行它(以模拟 的无 shell 调用;如果将 放在 之前,您还可以从 Windows 对话框 () 调用该命令进行真正的无 shell 调用):cmd.exepowershell.exe-noexit-cRunWinKey+R

powershell.exe -c powershell.exe -c Write-Output 'foo bar'

这不会像人们所期望的那样逐字输出,而是输出和单独的行;也就是说,围栏实际上丢失了,最终执行的是
,即通过了两个参数。
foo barfoobar'...'Write-Output foo bar

原因很微妙:

  • 当 PowerShell 执行外部程序(包括它自己的 CLI)时,它必须将其引用转换为后台引用,因为 Windows CLI 只能理解后一种形式。'...'"..."

    • 注意:与 Unix 不同,Windows CLI 必须充当自己的微型 shell,并从进程级命令行字符串中提取其参数。
  • 因此,当外部调用调用内部调用时,它会转换为幕后。powershell'foo bar'"foo bar"

  • 但是,将(未转义的)引用视为仅在命令行上具有语法功能,并且在将生成的参数解释为 PowerShell 代码之前删除此类引用,以便内部最终执行powershell.exe"..."powershell.exeWrite-Output foo bar

    • 如果您首先使用引号,即使只需调用一次,也可以看到问题(同样,由于传递了两个参数,并在单独的行上打印):"..."powershell.exefoobar

      powershell -c Write-Output "foo bar"
      

[1] 值得注意的是,此默认值在 pwshPowerShell (Core) 7+ CLI 中更改为 -File-f)。