在Ansible中修改指定行



如何从->

使用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"

当然,您必须根据文件的格式正确转义双引号。

相关内容

  • 没有找到相关文章