ansible 用变量替换正则表达式

Zul*_*kis 1 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'
Run Code Online (Sandbox Code Playgroud)

完美的结果

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

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

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

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

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

lar*_*sks 5

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

'\1{{ asterisk_db_host }}\2'
Run Code Online (Sandbox Code Playgroud)

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

'\1172.17.0.3\2'
Run Code Online (Sandbox Code Playgroud)

看看第一个学期。不再是\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
Run Code Online (Sandbox Code Playgroud)

这使用了 YAML 块引用 ( >-),因此我们无需担心在表达式中转义引号,并且在我的简单测试中它似乎做正确的事情。

  • 单独使用 `>` 将导致值以换行符结尾,这可能重要也可能不重要。使用 `>-` 可以避免这个终端换行符。`|` 是一个文字块(它保留换行符),而 `>` 将文本换行到一行。有关详细信息,请阅读 YAML 规范的 [Scalars](http://www.yaml.org/spec/current.html#id2503232) 部分。 (3认同)