在带有连接字符串的默认 Ansible 过滤器中转义反斜杠

Escaping backslash in a default Ansible filter with concatenated strings

我一直在努力解决以下问题:

我想转义默认过滤器中的反斜杠以连接两个变量。但是 Ansible 按预期抛出以下错误(反斜杠转义了 "):

jinja2.exceptions.TemplateSyntaxError: unexpected char '"' at 41

我一直在解决这个问题,但我想知道是否可以在我的字符串中以单个反斜杠 (\) 结尾。添加反斜杠以转义连接字符串中的反斜杠最终会给我一个双反斜杠。我知道 Ansible 逃脱了反斜杠。以下剧本演示了差异。

---
- hosts: 127.0.0.1
  connection: local
  vars:
    loop_var:
    - name: archive1
      path: '\domain.com\archive1'
      targetpath: 'foobar'
      fallback: 'bla\bla\bla'
    - name: archive2
      path: '\domain.com\archive2'
      fallback: 'bla\bla'

  tasks:
    - name: wanted output
      debug:
        msg: '{{ item.path }}\{{ item.fallback }}'
      loop: "{{ loop_var }}"
    - name: output default
      debug:
        msg: '{{ item.targetpath | default(item.path + "\" + item.fallback) }}'
      loop: "{{ loop_var }}"

这似乎是 Jinja 的词法分析器或 Ansible 的 Jinja 集成中的错误。您可以通过将 \ 移到表达式之外来解决它,这样它就不会触发错误:

    - name: output default
      debug:
        msg: "{{ item.targetpath | default(item.path ~ bs ~ item.fallback) }}"
      loop: "{{ loop_var }}"
      vars:
        bs: \