我想通过使用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时可以按预期工作
答案 0 :(得分:0)
正确的 regexp 在下面。转义的点仅与一个点匹配。第一个点应转义,但第二个则不能。这应该匹配任何字符。
regexp: '^(log4j\.rootLogger=.*)$'
但是这种解决方案不是幂等的。运行此任务将反复添加 appender
$ cat log4j.properties
log4j.rootLogger=WARN, memory, servlet, bla, bla
下面的 regexp 使任务成为幂等
regexp: '^(log4j\.rootLogger=.*?)(, {{ rootLoggerAppender }})?$'
提供文件
$ 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