我是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"
可以这样做吗?
答案 0 :(得分:9)
你可以试试这个:
- lineinfile:
state: present
dest: /etc/default/grub
backrefs: yes
regexp: '^(GRUB_CMDLINE_LINUX=(?!.*audit)\"[^\"]+)(\".*)'
line: '\1 audit=1\2'
这将在关闭双引号之前添加audit=1
它试图成为幂等的:在GRUB_CMD之后不匹配已经有 audit 字的行...
我建议先使用regex101这样的网站来测试你的正则表达式(那里还有一个替代模式)。
如果对结果满意,请继续执行ansible任务。
答案 1 :(得分:2)
我想确保参数也设置为正确的值,所以我使用了该替换调用:
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
来正确处理包含点和点之类的选项名称,而您只需指定一次即可。