ansible 用变量替换正则表达式

ansible 用变量替换正则表达式

我正在尝试替换localhost字符串

$amp_conf['AMPDBHOST'] = 'localhost';

与变量的内容相同{{ asterisk_db_host }},即172.17.0.3

虽然

- replace:
    dest: /usr/src/freepbx/installlib/installcommand.class.php
    regexp: '(\$amp_conf\[.AMPDBHOST.\] = .)localhost(.;)'
    replace: '\1\2'

完美结果

$amp_conf['AMPDBHOST'] = 'localhost';

- replace:
    dest: /usr/src/freepbx/installlib/installcommand.class.php
    regexp: '(\$amp_conf\[.AMPDBHOST.\] = .)localhost(.;)'
    replace: '\1{{ asterisk_db_host }}\2'

- replace:
    dest: /usr/src/freepbx/installlib/installcommand.class.php
    regexp: '(\$amp_conf\[.AMPDBHOST.\] = .)localhost(.;)'
    replace: '\1{{ asterisk_db_host|regex_escape() }}\2'

O2.17.0.2';用或替换字符串O2\.17\.0\.2';

我在这里做错了什么?我该如何正确地进行替换?

答案1

您的替换字符串如下所示:

'\1{{ asterisk_db_host }}\2'

在 Jinja 模板之后,这实际上是在正则表达式模块中用作替换字符串的内容:

'\1172.17.0.3\2'

看看第一个术语。它不再是\1,而是\1172,这显然是错误的。解决这个问题的一种方法是将值周围的引号作为替换的一部分(因为当您这样做时,将有一个非数字字符——引号——将您的反向引用与模板扩展的值分开)。这是一个选项:

- hosts: localhost
  gather_facts: false
  vars:
    asterisk_db_host: "172.17.0.3"
  tasks:
    - replace:
        dest: ./cfgfile
        regexp: >-
          (\$amp_conf\[.AMPDBHOST.\] = )'localhost'(;)
        replace: >-
          \1'{{ asterisk_db_host }}'\2

这使用了 YAML 块引用(>-),这样我们就不必担心在表达式中转义引号,而且在我的简单测试中它似乎做了正确的事情。

答案2

另一种解决方案是使用命名组:

  replace:
    dest: /usr/src/freepbx/installlib/installcommand.class.php
    regexp: '(?P<firstpart>\$amp_conf\[.AMPDBHOST.\] = .)localhost(.;)'
    replace: '\g<firstpart>{{ asterisk_db_host }}\2'

灵感来自http://www.handverdrahtet.org/2016/01/ansible-using-numbered-backreference.html

相关内容