无法转义与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"]'
我需要使用 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"]'