Ansible lineinfile - 修改一行

时间:2016-09-30 16:16:50

标签: ansible ansible-playbook ansible-2.x

我是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"

可以这样做吗?

2 个答案:

答案 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来正确处理包含点和点之类的选项名称,而您只需指定一次即可。