regex - 根据前缀使用 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 时,它按预期工作
解决方案
正确的正则表达式如下。转义点仅匹配一个点。第一个点应该被转义,但不是第二个。这应该匹配任何字符。
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
推荐阅读
- angular - Angular 网站在 IE11 上返回一个空白页面(无效字符错误)
- java - 如何正确读取具有多个内容的 InputStream
- reactjs - 如何将自定义反应组件文件夹发布到包含所有组件的 npm?
- php - Laravel Crud 应用程序编辑记录
- java - 如何将新文件上传到 GCP 存储桶中?
- javascript - 如何使 HTML 画布填满浏览器窗口?
- java - 如何确定 HttpClient PostMethod 的参数中包含 UTF-8 字符串?
- spring-boot - 集成数百种 SOAP 服务 - Spring Boot
- android - Android SDK 28 Android 9 和一些 ipad 上的 Phonegap App Json XMLHttpRequest() ProgressEvent 错误
- asp.net-mvc - FluentValidation 属性条件