0

我有一本剧本,它使用该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。

4

0 回答 0