首页 > 解决方案 > 根据前缀使用 ansible 将属性附加到 EOL

问题描述

我想通过使用 ansible 将字符串附加到 log4j.propertis 文件的 EOL。问题是文件有新行,当尝试使用 ansible 的 lineinfile 模块的“backrefs”时,它会在行下添加字符串,而不是附加到 EOL。

该文件是 log4j 属性文件,其中有一行我要编辑。该行以“log4j.rootLogger”开头,我想在 EOL 中附加一个字符串“bla”

这就是该行现在的样子: log4j.rootLogger=WARN, memory, servlet

更改后的预期: log4j.rootLogger=WARN, memory, servlet, bla

我使用的 ansible 代码,其中 rootLoggerAppender 是属性:

lineinfile:
    path: "{{ tomcat_path }}/webapps/ROOT/WEB-INF/config/log4j.properties"
    regexp: '^(log4j.rootLogger=\.*)'
    line: '\1, {{ rootLoggerAppender }}'
    backrefs: yes

更新:

当我 cat log4j.properties 输出如下:

# servlet appender - logs in memory only, allowing remote read of logs
log4j.rootLogger=DEBUG, memory, servlet

当我更新 ansible 代码以匹配确切的行时,输出符合预期。

lineinfile:
    path: "{{ tomcat_path }}/webapps/ROOT/WEB-INF/config/log4j.properties"
    regexp: '^(log4j\.rootLogger=DEBUG, memory, servlet)'
    line: '\1, {{ rootLoggerAppender }}'
    backrefs: yes

我还注意到该文件是一个 windows 文件,当将其转换为 linux 时,它按预期工作

标签: regexansible

解决方案


正确的正则表达式如下。转义点仅匹配一个点。第一个点应该被转义,但不是第二个。这应该匹配任何字符。

regexp: '^(log4j\.rootLogger=.*)$'

但是这个解决方案不是幂等的。运行此任务将重复添加附加程序

$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet, bla, bla

下面的正则表达式使任务幂等

regexp: '^(log4j\.rootLogger=.*?)(, {{ rootLoggerAppender }})?$'
  • 使第一组非贪婪
  • 第二组匹配 0 或 1 分隔的附加程序

给定文件

$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet

幂等剧本

- hosts: localhost
  vars:
    rootLoggerAppender: bla
  tasks:
    - lineinfile:
        path: log4j.properties
        regexp: '^(log4j\.rootLogger=.*?)(, {{ rootLoggerAppender }})?$'
        line: '\1, {{ rootLoggerAppender }}'
        backrefs: true

$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet, bla

playbook 的非幂等版本

- hosts: localhost
  vars:
    rootLoggerAppender: bla
  tasks:
    - lineinfile:
        path: log4j.properties
        regexp: '^(log4j\.rootLogger=.*)$'
        line: '\1, {{ rootLoggerAppender }}'
        backrefs: true

给出相同的结果

$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet, bla

,但是当重复运行时,它会不断添加分隔的附加程序

$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet, bla, bla

推荐阅读