Ansible:在行尾插入字符串,但前提是字符串不存在或/与更改值(如果存在)
Posted
技术标签:
【中文标题】Ansible:在行尾插入字符串,但前提是字符串不存在或/与更改值(如果存在)【英文标题】:Ansible: insert string at the end of the line but only if string is not present OR/AND change value if present 【发布时间】:2021-04-17 04:09:11 【问题描述】:我在以下情况下苦苦挣扎:
在 /etc/default/grub 文件中,有 GRUB_CMDLINE_LINUX_DEFAULT 节, 我需要在行尾插入 audit=1 如果值不存在 (请注意行尾有引号字符)。如果存在 audit=0,请将其更改为 audit=1。
lineinfile ansible 模块不起作用,尤其是在最后一个引号 (") 之前插入。
原来的 /etc/default/grub:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi="
可选的 /etc/default/grub:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi= audit=0" # change audit=0 to audit=1
#OR:
#GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi= audit=1" # audit=1 is already here, so no action needed
所需的 /etc/default/grub:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi= audit=1"
【问题讨论】:
【参考方案1】:我创建了一个文本为 audit=0 的文件,并尝试将其替换为 audit=1
我的文件是: grubfile:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi= audit=0"
我的剧本:
---
- name: read grub file
lineinfile:
dest: /home/myhome/grubfile.txt
regexp: '^(.*)audit=0(.*)$'
line: '\1audit=1\2'
backup: yes
backrefs: yes
基本上,我们使用正则表达式,将 audit=1 作为正则表达式,并使用 backrefs 存储字符串的其余部分 结果文件是:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=xfs quiet splash acpi_osi= audit=1"
编辑: 即使不存在,此代码也会添加它,如果存在 audit=0,它将首先修改,然后检查是否存在 audit=1,如果不存在,则将 audit=1 附加到开头引号:
---
- name:
lineinfile:
dest: /home/mypath/grubfile.txt
regexp: '^(.*)audit=1(.*)$'
state: absent
check_mode: yes
changed_when: false
register: auditexist
- name: if audit=0 write audit=1
lineinfile:
dest: /home/mypath/grubfile.txt
regexp: '^(.*)audit=0(.*)$'
line: '\1audit=1\2'
backup: yes
backrefs: yes
register: auditmodified
- name: appen
lineinfile:
dest: /home/ivan/grubfile.txt
regexp: '^(.*)GRUB_CMDLINE_LINUX_DEFAULT="(.*)$'
line: '\1GRUB_CMDLINE_LINUX_DEFAULT="audit=1 \2 '
backup: yes
backrefs: yes
when: not auditexist.found and not auditmodified.changed
结果:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="audit=1 rootfstype=xfs quiet splash acpi_osi="
【讨论】:
谢谢 ikora!但是如果文件中不存在 audit= 怎么办? 它不会做任何事情,也许我误解了你,如果你总是想强制让 audit=1 即使审计不存在,也许你可以将整行替换为包含的整行审计=1 是的,audit=1 需要永久存在于文件中。无法替换整个文件,因为不同的系统具有不同的 grub 配置(Debian、Redhat 等) 我会尽快更新 mu 答案,我想我可以做到这一点,添加 audit=1 作为第一个参数会起作用吗?像 w:GRUB_CMDLINE_LINUX_DEFAULT="audit=1 rootfstype=xfs quiet splash acpi_osi=" 这样的东西可以吗?还是必须让 rootfstype 先行?对不起,我不了解 grubfiles :D 用我想你想要的结果修改了答案,试试吧。以上是关于Ansible:在行尾插入字符串,但前提是字符串不存在或/与更改值(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章