我有一本剧本,它使用该win_shell
模块来运行一些操纵 JSON 对象的 powershell 命令。我将 Ansible 中的一些变量输入到 powershell 中,然后使用{% raw %}...{% endraw %}
. 运行此程序时,似乎{% raw %}
块内的任何内容都会两次发送到 powershell。
下面是一个说明问题的简化示例。
剧本.yml:
- hosts: all
gather_facts: no
tasks:
- name: set facts
set_fact:
test: "bob"
- debug: var=test
- name: run commands
win_shell: |
$test="{{ test }}"
{% raw %}
ls "C:\$test"
{% endraw %}
register: result
- debug: var=result
使用以下命令运行此错误:
{
"changed": true,
"cmd": "$test=\"bob\"\n\nls \"C:\\$test\"\n\"\n\nls \"C:\\$test\"",
"delta": "0:00:00.468750",
"end": "2021-10-06 12:54:18.615848",
"msg": "non-zero return code",
"rc": 1,
"start": "2021-10-06 12:54:18.147098",
"stderr": "The string is missing the terminator: \".\r\n + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException\r\n + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString",
"stderr_lines": [
"The string is missing the terminator: \".",
" + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException",
" + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString"
],
"stdout": "",
"stdout_lines": []
}
具体来说,错误是:
$ jq -r '.stderr' result.json
The string is missing the terminator: ".
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
但命令是:
$ jq -r '.cmd' result.json
$test="bob"
ls "C:\$test"
"
ls "C:\$test"
我不知道为什么它会这样重复。看起来像将多项数组与字符串连接时遇到的问题,但这里不是这种情况。
如果我删除{% raw %}
转义符,那么它可以正常工作,就像我转义整个 shell 块一样,而不仅仅是它的一部分。我可以{% raw %}
通过转义 shell 块中的任何 JSON 对象来使用,但我很好奇为什么会发生这种情况。
Ansible 是 2.9.2。