Ansible lineinfile - 修改一行

Ansible lineinfile - modify a line

我是 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: " audit=1"

这可以做到吗?

你可以试试这个:

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

这将在关闭双引号之前添加 audit=1(带有前导 space)。没有双引号就不会匹配。 并且它试图做到幂等:不匹配 GRUB_CMDLINE_LINUX=.

之后已经有 audit(带有前导 space)的行

我建议先使用 regex101 等网站来测试您的正则表达式(那里也有替换模式)。
当您对结果感到满意时,继续执行 Ansible 任务。

我想确保参数也设置为正确的值,所以我使用了这个替换调用:

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

如果该选项以前不存在,如果它存在但有错误的选项(然后仅更改值)并且整个字符串为空(但在选项前添加 space然后)。此外,它使用 regex_escape 来正确处理包含点等的选项名称,您只需指定一次。