【发布时间】:2019-09-30 19:06:04
【问题描述】:
我试图确保一行以 'audit=1"' 结尾。之前的状态是:
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vg00/lv_root rhgb 安静”
之后的状态应该是:
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
编辑:使用和平主义者的建议,我有一个可行的解决方案。确认如果缺少我的 audit=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 上查看另一个示例,我想知道根本问题是否是第一组比赛中 .* 通配符的贪婪性质。 /耸肩
【问题讨论】:
标签: ansible