根据前缀将属性附加到EOL

时间:2019-12-06 12:40:39

标签: regex ansible

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

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

这是现在的样子: log4j.rootLogger = WARN,内存,servlet

更改后预期: log4j.rootLogger = WARN,内存,servlet,bla

我在rootLoggerAppender是属性的地方使用了ansible代码:

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

更新:

当我选择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时可以按预期工作

1 个答案:

答案 0 :(得分:0)

正确的 regexp 在下面。转义的点仅与一个点匹配。第一个点应转义,但第二个则不能。这应该匹配任何字符。

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

但是这种解决方案不是幂等的。运行此任务将反复添加 appender

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

下面的 regexp 使任务成为幂等

regexp: '^(log4j\.rootLogger=.*?)(, {{ rootLoggerAppender }})?$'
  • 使第一组变得没有恐惧
  • 第二组匹配0或1个定界的 appender

提供文件

$ 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

剧本的非幂等版本

- 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

,但是当反复运行时,它会继续添加定界的 appender

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