LINUX.ORG.RU

Как дописать нолик к ссылке назад, чтобы он остался ноликом (а не добавлялся к номеру ссылки)?

 ,


0

1

У меня такая проблема. Мне нужно найти регуляркой группу, после которого надо написать строку, начинающуюся с нолика. Делаю я это для плейбука Ansible:

  - name: Переключение сетевой маски доступа PostgreSQL для сетей IPv4
    lineinfile:
      destfile: /etc/postgresql/9.1/main/pg_hba.conf
      regexp: '(^host\s*all\s*all\s*)\d+\.\d+\.\d+\.\d+\/\d+\s*md5'
      line: '\10.0.0.0/0 md5'
      backrefs: yes

Проблема в том, что ссылка назад с номером 1 не определяется. Ansible думает, что я хочу использовать ссылку с номером 10.

Ошибка такая:


fatal: [arm2]: FAILED! => {«changed»: false, «failed»: true, «module_stderr»: «Shared connection to 192.168.111.102 closed.\r\n», «module_stdout»: «Traceback (most recent call last):\r\n File \»/tmp/ansible_AT9bap/ansible_module_lineinfile.py\", line 425, in <module>\r\n main()\r\n File \«/tmp/ansible_AT9bap/ansible_module_lineinfile.py\», line 417, in main\r\n ins_aft, ins_bef, create, backup, backrefs)\r\n File \«/tmp/ansible_AT9bap/ansible_module_lineinfile.py\», line 252, in present\r\n b_new_line = m.expand(b_line)\r\n File \«/usr/lib/python2.7/re.py\», line 266, in _expand\r\n return sre_parse.expand_template(template, match)\r\n File \«/usr/lib/python2.7/sre_parse.py\», line 789, in expand_template\r\n raise error, \«invalid group reference\»\r\nsre_constants.error: invalid group reference\r\n", «msg»: «MODULE FAILURE»}



Если я заменю вот так, то ошибки нет:

line: '\1a.b.c.d/e md5'

Вроде как обычные регулярки такие случаи правильно разруливают: например, если ссылки назад с номером 10 нет, будет использоваться номер 1, а 0 будет рассматриваться как символ. Но в Ansible это не так.

Вопрос: как обойти эту особенность, и написать ссылку назад \1 и после нее символ 0?

★★★★★

Ответ на: комментарий от WoozyMasta

Этот модуль я чуть попозже поковыряю. Вышеописанная ситуация может возникнуть и в других файлах.

В общем, в модуле lineinfile есть особенность: если нет опции «backrefs: yes», то, если регулярка не сработала ни на одной строке, тогда строка из опции line будет добавлена в файл.

Таким образом, если не ставить «backrefs: yes», то простая задача:

regexp: '^optionName=first'
line: '^optionName=second'

будет вести себя корректно только в том случае, если в файле будет строка «optionName=first». А если же в файле будет уже измененная строка «optionName=second», то задача эту строку не найдет, и заодно создаст вторую такую строку.

Таким образом, опция «backrefs: yes» страхует от появления дополнительных строчек в файле. А заодно, ее можно использовать даже, если никаких обратных ссылок в регулярке не прописывать.

Таким образом, для топиковой задачи решение может быть таким:
      regexp: '^host\s*all\s*all\s*\d+\.\d+\.\d+\.\d+\/\d+\s*md5'
      line: 'host all all 0.0.0.0/0 md5'
      backrefs: yes

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от WoozyMasta

Эмм, а модуль для чего сделали тебе?

Кстати, у меня модуля postgresql_pg_hba нет, Ansible v.2.2, а он походу появился в v.2.8.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Эмм, а модуль для чего сделали тебе?

Кстати, у меня модуля postgresql_pg_hba нет, Ansible v.2.2, а он походу появился в v.2.8.

Да, там много чего заапрувили в 2.8. Если касаемо psql то такие ништяки к примеру как postgresql_set и postgresql_query появились, ну и функционал имеющихся расширили.

Рекомендую использовать свежак, 2.9 - полет нормальный.

WoozyMasta
()
Ответ на: комментарий от si0

Я что-то не понял, конструкция «\g<1>» только в регулярках Python работает? Тогда какой в ней смысл для других реализаций регулярок?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Предполагаю, что в Ansible не стали изобретать собственные regex-ы и пользуются стандартной библиотекой Python

si0 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.