Я пытаюсь заменить 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{{ 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 (>-
), так что нам не нужно беспокоиться об экранировании кавычек в наших выражениях, и, похоже, это правильно в моих простых тестах.
Другое решение - использовать именованные группы:
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