考虑以下Ansible剧本:
- name: Dump
hosts: test
gather_facts: false
tasks:
- name: Dump1
debug:
var: "{{ 'foo-123-far'| regex_replace('^foo-([0-9]+).*$', '\\\\1') }}"
- name: Dump2
debug: var="{{ 'foo-123-far'| regex_replace('^foo-([0-9]+).*$', '\\1') }}"
这会产生以下输出:
TASK: [Dump1] *****************************************************************
ok: [localhost] => {
"var": {
"123": "123"
}
}
TASK: [Dump2] *****************************************************************
ok: [localhost] => {
"var": {
"123": "123"
}
}
为什么必须在Dump1中使用\1
转义\\\\1
,其中我不使用magical key = value参数,但\\1
在第二个中是否足够?
答案 0 :(得分:0)
在第一种情况下(var:
在其自己的行上),Ansible必须专门处理引用以避免: {{
的有问题的组合,因此它可能在解析中对该行进行特殊处理相。
第二种情况实际上并不需要双引号,因此Ansible可能会提前删除它们,然后以不同方式处理该行。
有a note here表明你正在打击的情况:
如果“regex_replace”过滤器与YAML参数中的变量一起使用(而不是更简单的'key = value'参数),那么你需要使用4个反斜杠(\\)而不是2来反转反向引用(例如\ 1)( \)。