Назад | Перейти на главную страницу

недоступно заменить регулярное выражение переменной

Я пытаюсь заменить 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