提问人:Daniel Zamloot 提问时间:6/24/2023 更新时间:6/26/2023 访问量:264
Ansible Tower 将参数传递给 powershell 脚本
Ansible Tower pass parameter to powershell script
问:
我正在尝试将 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
非常感谢任何帮助
答:
该问题可能与正在使用的脚本模块有关,因为它没有参数选项。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 '\*', ' '
从 Ansible 脚本
模块的文档来看(并且您已经确认是正确的):
给定的脚本及其参数通过 shell 执行。
在 Windows 上,该 shell 似乎是
PowerShell(powershell.exe,Windows
PowerShell CLI),并且该属性后面的内容似乎传递给 () 参数。script:
-Command
-c
- 此参数将其参数解释为任意 PowerShell 代码,因此根据 PowerShell 的语法规则进行处理。
- 顺便说一句:这意味着您不仅限于调用脚本文件,并且可以传递多个命令,以
;
因此,您无需指定 executable:
参数即可在 Windows 上执行 PowerShell 脚本,以下内容就足够了(请注意,我使用的是模块的 FCQN(完全限定集合名称),而不是文档中建议的短名称):ansible.builtin.script
script:
- name: Deploy Report
hosts: ******
tasks:
- name: Run Powershell Script
ansible.builtin.script: "../deploy.ps1 -input1 '{{ input1 }}'"
至于你试过的:
通过在 下指定为参数,最终嵌套了两个 PowerShell 实例:一个隐式用于执行,另一个是显式调用的实例。powershell
executable:
args:
- 请注意,在调用中的命令之前既不指定 () 也不指定 () 意味着
-Command
-c
-File
-f
powershell.exe
-Command
(-c
)
这种嵌套不仅是不必要的,而且会导致命令行中引用的有效丢失,这解释了您的症状。'...'
script:
下面的示例演示了这一点 - 从交互式会话运行它(以模拟 的无 shell 调用;如果将 放在 之前,您还可以从 Windows 对话框 () 调用该命令进行真正的无 shell 调用):cmd.exe
powershell.exe
-noexit
-c
Run
WinKey+R
powershell.exe -c powershell.exe -c Write-Output 'foo bar'
这不会像人们所期望的那样逐字输出,而是输出和单独的行;也就是说,围栏实际上丢失了,最终执行的是
,即通过了两个参数。foo bar
foo
bar
'...'
Write-Output foo bar
原因很微妙:
当 PowerShell 执行外部程序(包括它自己的 CLI)时,它必须将其引用转换为后台引用,因为 Windows CLI 只能理解后一种形式。
'...'
"..."
- 注意:与 Unix 不同,Windows CLI 必须充当自己的微型 shell,并从进程级命令行字符串中提取其参数。
因此,当外部调用调用内部调用时,它会转换为幕后。
powershell
'foo bar'
"foo bar"
但是,将(未转义的)引用视为仅在命令行上具有语法功能,并且在将生成的参数解释为 PowerShell 代码之前删除此类引用,以便内部最终执行
powershell.exe
"..."
powershell.exe
Write-Output foo bar
如果您首先使用引号,即使只需调用一次,也可以看到问题(同样,由于传递了两个参数,并在单独的行上打印):
"..."
powershell.exe
foo
bar
powershell -c Write-Output "foo bar"
[1] 值得注意的是,此默认值在 pwsh
(PowerShell (Core) 7+ CLI 中更改为 -File
(-f
)。
评论