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:在行尾插入字符串,但前提是字符串不存在或/与更改值(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章

使用 notepad++ 编辑器在行首行尾添加字符

DB2 在行插入时创建一个随机但唯一的字符标识符

Word VBA命令确定找到的字符是否在行尾

vim技巧3

如何格式化我的 grep 输出以在行尾显示行号以及命中数?

notepad++ 行首行尾添加字符