Ansible:在行尾插入字符串,但仅当字符串不存在或/与更改值如果存在

问题描述

我在以下场景中挣扎:

/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"

解决方法

我创建了一个文件,其中文本为 audit=0 并尝试将其替换为 audit=1

我的文件是: 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"

我的剧本:

---
  - 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="

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...