Ansible: модуль lineinfile с использованием regexp и backrefs - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь убедиться, что строка заканчивается на «audit = 1" ». Состояние« до »:

GRUB_CMDLINE_LINUX =" crashkernel = auto rd.lvm.lv = vg00 / lv_root rhgbquiet "

Состояние после должно быть:

GRUB_CMDLINE_LINUX =" crashkernel = auto rd.lvm.lv = vg00 / lv_root rhgb quiet аудит = 1 "

Работая с модулем Ansible lineinfile, я могу добавить это утверждение, если оно отсутствует, но повторные запуски продолжают добавлять 'audit = 1 "', даже если он присутствует. Я играл с регулярным выражением и отрицательными прогнозными утверждениями и просто не могу получить правильный синтаксис.

Вот пример игры, которую я имею:

  - name: grub - adjust
    lineinfile:
      path: /home/vwadmin/grub-test
      regexp: '(GRUB_CMDLINE_LINUX=.*)"(?!audit=1")'
      line: '\1 audit=1"'
      backrefs: yes
      state: present

Редактировать: Используя предложение Пацифиста Iесть рабочее решение. Подтвердил добавление моего аудита = 1, если оно отсутствует, и ничего не делать, если оно присутствует.

  - name: grub - check
    shell: grep -c 'audit' /etc/default/grub
    register: grub_file
    ignore_errors: true

  - name: grub - adjust
    lineinfile:
      path: /etc/default/grub
      regexp: '(GRUB_CMDLINE_LINUX=.*)"'
      line: '\1 audit=1"'
      backrefs: yes
      state: present
    when: grub_file.stdout == "0"

Примечание: я не могу не почувствовать причину, по которой я не смог заставить ее работать без предварительного шага,и почему он не работает должным образом с check_mode, заключается в том, что отрицательный прогноз не определен правильно для этого случая. Из того, что я понимаю, совпадение регулярного выражения должно потерпеть неудачу, когда отрицательный упреждающий запрос будет успешным, что должно заставить модуль не предпринимать действий. Глядя на другой пример этого на GG , мне интересно, является ли коренная проблема жадным характером подстановочного знака. * В первом совпадении группы. / Пожав плечами

1 Ответ

1 голос
/ 30 сентября 2019

lineinfile выполняет свою работу, добавляя все, что указано в line, и строка идентифицируется вашим regexp. Поэтому, независимо от того, какое значение уже имеет ваша настройка, она будет переопределена вашим новым line.

. Вы можете использовать два подхода:

  1. Использование check_mode сfailed_when.
  2. Использование модуля shell для grep содержимого заранее.

Check_Mode (Я не могу заставить это работать, но оно имеетРекомендовано везде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...