在Ansible中不一致的逃避

时间:2015-07-29 11:19:38

标签: yaml ansible

考虑以下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在第二个中是否足够?

1 个答案:

答案 0 :(得分:0)

在第一种情况下(var:在其自己的行上),Ansible必须专门处理引用以避免: {{的有问题的组合,因此它可能在解析中对该行进行特殊处理相。

第二种情况实际上并不需要双引号,因此Ansible可能会提前删除它们,然后以不同方式处理该行。

a note here表明你正在打击的情况:

  

如果“regex_replace”过滤器与YAML参数中的变量一起使用(而不是更简单的'key = value'参数),那么你需要使用4个反斜杠(\\)而不是2来反转反向引用(例如\ 1)( \)。