我试图确保一行以 '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 安静审核=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
Run Code Online (Sandbox Code Playgroud)
编辑:使用和平主义者的建议我有一个可行的解决方案。确认添加我的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"
Run Code Online (Sandbox Code Playgroud)
注意:我情不自禁地感觉到,如果没有预先步骤,我就无法让它工作,并且它不能与 check_mode 一起正常工作的原因是,在这种情况下,负前瞻没有正确定义。据我了解,当否定前瞻成功时,正则表达式匹配应该失败,这应该导致模块不采取行动。看看GG上的另一个例子,我想知道根本问题是否是第一组比赛中 .* 通配符的贪婪本质。/耸肩
lineinfile正在执行其工作,即添加 中给出的任何内容line,并且行由您的regexp. 因此,无论您的设置已有什么值,它都会被您的新设置覆盖line。
您可以使用两种方法:
check_mode与 一起使用failed_when。shell模块。grepCheck_Mode(虽然我无法让它工作,但其他地方都推荐它):
- name: grub - adjust
lineinfile:
name: /home/vwadmin/grub-test
regexp: '(GRUB_CMDLINE_LINUX=.*)'
line: '\1 audit=1"'
backrefs: yes
state: present
check_mode: yes
register: presence
failed_when: presence.changed
Run Code Online (Sandbox Code Playgroud)
使用 grep(这个对我来说工作得很好)
- name: grub - adjust
shell: grep -c 'audit' /home/vwadmin/grub-test
register: file
ignore_errors: true
- name: Present
debug: msg="audit is present"
when: file.stdout != "0"
- name: Not Present
debug: msg="audit is not present"
when: file.stdout == "0"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4299 次 |
| 最近记录: |