我正在尝试replacestring中的localhost
$amp_conf['AMPDBHOST'] = 'localhost';
variables{{ 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';replacestringO2.17.0.2'; 或O2\.17\.0\.2'; 。
我在这里做错了什么? 我怎样才能正确地做这个replace?
您的replacestring如下所示:
'\1{{ asterisk_db_host }}\2'
在Jinja模板之后,这是在regex模块中实际被用作replacestring的东西:
'\1172.17.0.3\2'
看看第一届。 现在不再是\1172 ,这显然是错误的。 解决这个问题的一种方法是在replace的值部分引用引号(因为当你这样做的时候,会有一个非数字字符 – 引用 – 将你的反向引用从模板扩展的值中分离出来)。 这里有一个选项:
- 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块引用( >- ),以便我们不需要担心在我们的expression式中引用转义,而且在我的简单testing中似乎做了正确的事情。
另一个解决scheme是使用命名组:
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的启发