如何从->
使用Ansible更新/etc/default/grub中的一行GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet"
GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet console=ttyS0,1100"
我试了以下-
- name: Updating of GRUB_CMDLINE_LINUX
lineinfile:
path: "/etc/default/grub"
regexp: "^(.*GRUB_CMDLINE_LINUX.*)$"
line: '1 console=ttyS0,1100"'
但它只是在句末添加了console=ttyS0,1100"
,导致了一个额外的"(从现有的句子)。
quiet" console=ttyS0,1100"
帮忙吗?
将数据放入列表中。例如,
grub_add:
- {key: GRUB_CMDLINE_LINUX, value: 'console=ttyS0,1100'}
给定用于测试的文件
shell> cat grub
GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet"
下面的任务执行任务
- lineinfile:
backrefs: true
path: '{{ playbook_dir }}/grub'
regexp: '^s*{{ item.key }}s*="(?!.*{{ item.value }})(.*)"$'
line: '{{ item.key }}="1 {{ item.value }}"'
loop: "{{ grub_add }}"
您必须启用backrefs来引用行中的捕获组。
如果值不存在,regexp将匹配。参见
下面的"负向前看断言"项
^ ....................... the beginning of the string
s* ..................... 0 or more whitespace
{{ item.key }} .......... the key
s* ..................... 0 or more whitespace
=" ...................... it is what you think it is
(?!.*{{ item.value }}) .. negative lookahead assertion; matches if the value is not present
(.*)" ................... the capture group followed by the double-quote
$ ....................... the end of the string
值如果不存在,将被附加到行中。
使用单引号样式。你不必转义特殊字符
使用——check——diffoptions运行剧本
TASK [lineinfile] ****************************************************************************
--- before: /export/scratch/tmp7/test-130/grub (content)
+++ after: /export/scratch/tmp7/test-130/grub (content)
@@ -1 +1 @@
-GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet"
+GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet console=ttyS0,1100"
changed: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'console=ttyS0,1100'})
任务是幂等的。当你重复它时,不会有任何变化。
测试项目示例
shell> tree .
.
├── ansible.cfg
├── grub
├── grub.orig
├── hosts
└── pb.yml
shell> cat grub
GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet"
完整剧本的示例。测试将所有参数添加到列表
shell> cat pb.yml
- hosts: localhost
vars:
grub_add:
- {key: GRUB_CMDLINE_LINUX, value: 'audit=1'}
- {key: GRUB_CMDLINE_LINUX, value: 'crashkernel=auto'}
- {key: GRUB_CMDLINE_LINUX, value: 'rhgb'}
- {key: GRUB_CMDLINE_LINUX, value: 'quiet'}
- {key: GRUB_CMDLINE_LINUX, value: 'console=ttyS0,1100'}
tasks:
- lineinfile:
backrefs: true
path: '{{ playbook_dir }}/grub'
regexp: '^s*{{ item.key }}s*="(?!.*{{ item.value }})(.*)"$'
line: '{{ item.key }}="1 {{ item.value }}"'
loop: "{{ grub_add }}"
给运行——check——diff选项
shell> ansible-playbook pb.yml -CD
PLAY [localhost] *****************************************************************************
TASK [lineinfile] ****************************************************************************
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'audit=1'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'crashkernel=auto'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'rhgb'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'quiet'})
--- before: /export/scratch/tmp7/test-130/grub (content)
+++ after: /export/scratch/tmp7/test-130/grub (content)
@@ -1 +1 @@
-GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet"
+GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet console=ttyS0,1100"
changed: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'console=ttyS0,1100'})
PLAY RECAP ***********************************************************************************
localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
为
shell> ansible-playbook pb.yml
PLAY [localhost] *****************************************************************************
TASK [lineinfile] ****************************************************************************
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'audit=1'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'crashkernel=auto'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'rhgb'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'quiet'})
changed: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'console=ttyS0,1100'})
PLAY RECAP ***********************************************************************************
localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
结果
shell> cat grub
GRUB_CMDLINE_LINUX="audit=1 crashkernel=auto rhgb quiet console=ttyS0,1100"
剧本是幂等的
shell> ansible-playbook pb.yml
PLAY [localhost] *****************************************************************************
TASK [lineinfile] ****************************************************************************
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'audit=1'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'crashkernel=auto'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'rhgb'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'quiet'})
ok: [localhost] => (item={'key': 'GRUB_CMDLINE_LINUX', 'value': 'console=ttyS0,1100'})
PLAY RECAP ***********************************************************************************
localhost: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
为了获得命令行,使用以下正则表达式将其分解为输入:
^GRUB_CMDLINE_LINUX="(.*)"$
现在可以得到1
中的实际值,因此可以将输出写成:
GRUB_CMDLINE_LINUX="1 console=ttyS0,1100"
当然,您必须根据文件的格式正确转义双引号。