无法转义与Ansible中的变量连接的括号

Can't escape brackets concatenated with variables in Ansible

我需要使用 Ansible 更新数据库 table 中的记录,我需要在字段中输入的值采用以下形式:["\/{{name}}"] 其中 name 是一个变量。

因此,如果 name 的值为 Alex,则 url 列的更新值将恰好为 ["\/Alex"]

我这样做如下:

  - name: Update record
    postgresql_query:
      query: > 
        update table1 set url = %s
      positional_args:
      - '["\/{{name}}"]'

当我在 运行 剧本之后检查数据库时,我发现的值是:{'\/Alex'};括号替换为 curly 大括号,反斜杠重复,双引号替换为单引号。

我尝试了多种解决方法,例如转义括号和反斜杠:'\["\/{{name}}"\]',我也尝试这样做:'{% raw %}["\/{% endraw %}{{name}}{% raw %}"]{% endraw %}'(从 jinja2 docs 中获取),但是 none 成功了。

看来您实际上必须将 name 变量转换为字符串,否则,Jinja 会以某种方式将您的列表项解释为 set{'\/Alex'} 是 Python.

因此,您的正确语法是:

- name: Update record
  postgresql_query:
    query: > 
      update table1 set url = %s
    positional_args:
      - '["\/{{ name | string }}"]'

鉴于剧本:

- hosts: localhost
  gather_facts: no

  tasks:
    - postgresql_query:
        query: >-
          update table1 set url = %s
        positional_args:
          - '["\/{{ name | string }}"]'
      vars:
        name: Alex
      register: sql

    - debug: 
        var: sql.query

如预期的那样产生:

TASK [postgresql_query] ******************************************************
changed: [localhost]

TASK [debug] *****************************************************************
ok: [localhost] => 
  sql.query: update table1 set url = '["\/Alex"]'