![ansible 用变量替换正则表达式](https://linux22.com/image/696663/ansible%20%E7%94%A8%E5%8F%98%E9%87%8F%E6%9B%BF%E6%8D%A2%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我正在尝试替换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