【问题标题】:appending attribute to EOL with ansible according to prefix根据前缀使用 ansible 将属性附加到 EOL
【发布时间】:2019-12-06 12:40:39
【问题描述】:

我想通过使用 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 时,它可以正常工作

【问题讨论】:

    标签: regex ansible


    【解决方案1】:

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

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

    但是这个解决方案不是幂等的。运行这个任务会重复添加appender

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

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

    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
    

    【讨论】:

    • 这是您的第一个正则表达式建议后的结果行: , blaLogger=WARN, memory, servlet
    • 我可以看到正确的结果。我已经仔细检查了示例并更新了答案。如果您有任何问题,请使用Minimal, Reproducible Example 更新问题。
    • 我已经更新了这个问题。它仍然无法正确更新文件。结果仍然是我上面提到的行首的属性blaLogger=WARN, memory, servlet,所以我尝试匹配整行并运行代码,它成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多