Ansible lineinfile - изменить строку

Я новичок в Ansible и пытаюсь изменить строку в /etc/default/grub, чтобы включить аудит.

Мне нужно добавить audit=1 в кавычки где-нибудь в строке, которая выглядит так:

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap biosdevname=0 net.ifnames=0 rhgb quiet net.ifnames=0"

Пока мне удалось удалить строку, и у меня осталось только

net.ifnames=0, audit=1

когда я использую что-то вроде

lineinfile:
  state: present
  dest: /etc/default/grub
  backrefs: yes
  regexp: "net.ifnames=0"
  line: "\1 audit=1"

Можно ли это сделать?


person Jeff Bilbro    schedule 30.09.2016    source источник


Ответы (2)


Вы можете попробовать это:

- lineinfile:
    state: present
    dest: /etc/default/grub
    backrefs: yes
    regexp: '^(GRUB_CMDLINE_LINUX=(?!.* audit)\"[^\"]+)(\".*)'
    line: '\1 audit=1\2'

Это добавит audit=1 (с начальным пробелом) непосредственно перед закрывающей двойной кавычкой. Он не будет соответствовать без двойных кавычек. И он пытается быть идемпотентным: не соответствует строкам, в которых уже есть audit (с начальным пробелом) после GRUB_CMDLINE_LINUX=.

Я бы рекомендовал использовать такие сайты, как regex101, чтобы сначала проверить свои регулярные выражения (там также есть режим подстановки).
Когда вы будете удовлетворены результатом, переходите к задаче Ansible.

person Konstantin Suvorov    schedule 30.09.2016
comment
@Jeff Bilbro - если вам нужно добавить его только в строки с net.ifnames = 0, вам нужно добавить это в строку регулярного выражения, которую предоставил Константин Сурворов. Наверное, примерно так: regexp: '^(GRUB_CMDLINE_LINUX=.*net.iframes=0.*(?!.*audit)\"[^\"]+)(\".*)' - person dan_linder; 01.10.2016
comment
Чтобы это также работало, когда GRUB_CMDLINE_LINUX пуст, вы можете использовать ^(GRUB_CMDLINE_LINUX=(?!.*audit)\"[^\"]*)(\".*) - person acidtv; 15.05.2019
comment
Для всех, кто попадает сюда с несколько связанным вопросом: в Ubuntu 18.04 я хотел использовать GRUB_CMDLINE_LINUX_DEFAULT= вместо GRUB_CMDLINE_LINUX=, потому что, похоже, это тот, который используется обычно (где все остальные параметры). - person Carolus; 15.12.2019
comment
Может ли кто-нибудь объяснить, почему это разрешает любые символы после второй двойной кавычки? Разве правильные строки не начинаются и не заканчиваются двойными кавычками (или вообще не имеют двойных кавычек в строке)? - person Carolus; 15.12.2019
comment
может ли эта строка быть добавлена ​​в отдельный файл в /etc/default/grub.d/ директории и иметь такой же эффект? - person Jean Monet; 23.12.2020

Я хотел убедиться, что для параметра также установлено правильное значение, поэтому я использовал этот вызов замены:

replace:
  path: /etc/default/grub
  regexp: '^(GRUB_CMDLINE_LINUX=(?:(?![" ]{{ option | regex_escape }}=).)*)(?:[" ]{{ option | regex_escape }}=\S+)?(.*")$'
  replace: '\1 {{ option }}={{ value }}\2'
vars:
  option: audit
  value: 1

Это работает, если параметр не присутствовал ранее, если он был, но имел неправильный параметр (только тогда изменяет значение) и если вся строка была пустой (но затем добавляет пробел перед параметром). Кроме того, он использует regex_escape для правильной работы с именами параметров, которые содержат точки и т.п., и вам нужно указать их только один раз.

person jplitza    schedule 13.08.2020