【问题标题】:Ansible Insert XML before regex expressionAnsible 在正则表达式之前插入 XML
【发布时间】:2019-11-14 23:40:27
【问题描述】:

这是一个适用于 javascript/python 的示例正则表达式

<!--.*[\n\t].*LAST FILTER IN THE DEFINED CHAIN.*[\n\t].*-->

反对这份文件:

<filter>
    <filter-name>filter-plugin-dispatcher-before-dispatch-error</filter-name>
    <filter-class>com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter</filter-class>
    <init-param>
        <param-name>location</param-name>
        <param-value>before-dispatch</param-value>
    </init-param>
    <init-param>
        <param-name>dispatcher</param-name>
        <param-value>ERROR</param-value>
    </init-param>
</filter>
<filter>
    <filter-name>OktaLoginFilter<`enter code here`/filter-name>
    <filter-class>com.atlassian.jira.authenticator.okta.OktaLoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>OktaLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
<!-- =====================================================
     THIS MUST BE THE LAST FILTER IN THE DEFINED CHAIN
     ===================================================== -->
<filter>
    <filter-name>JiraLastFilter</filter-name>
    <filter-class>com.atlassian.jira.web.filters.JiraLastFilter</filter-class>
</filter>

现在我需要弄清楚如何使用 ansible 在上述模式之前正确插入一个 xml 块。

我曾尝试使用此模块:https://docs.ansible.com/ansible/latest/modules/blockinfile_module.html,目前对上述的尝试一直在使用配置

- name: Insert/Update XML surronded by cutsomer markers after the last </filter>
  blockinfile:
    path: "path to file "
    backup: true
    marker: "<!-- {mark} ANSIBLE SIGSCI MANAGED BLOCK -->"
    insertbefore: "(<!--.*[\n\t].*LAST FILTER IN THE DEFINED CHAIN.*[\n\t].*-->)"
    block: |
        <filter>
            <filter-name>sigSciFilter</filter-name>
            <filter-class>params</filter-class>
            <init-param>
                <param-name>rpcTimeout</param-name>
                <param-value>500</param-value>
            </init-param>
            <init-param>
                <param-name>params</param-name>
                <param-value>unix:/var/run/params</param-value>
            d</init-param>
        </filter>
        <filter-mapping>
            <filter-name>parms</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
  notify:
    - Restart Sigsci

但是,这个正则表达式模式不匹配文档中的任何内容,而是插入到文档的末尾。我不确定此模块中使用的风味正则表达式,但 lineinfile 模块允许使用 python 正则表达式,我想如果我插入一行,那会起作用,但我试图在匹配的正则表达式之前插入一个 xml 块.

【问题讨论】:

    标签: regex bash shell grep ansible


    【解决方案1】:

    如果您真的想为工作使用错误的工具,您可以使用-zgrep 拆分为空字节而不是换行符。实际上,它将整个 XML 文件视为一行:

    $ grep -zo '<!--.*LAST FILTER IN THE DEFINED CHAIN.*-->' yourfile
    <!-- =====================================================
         THIS MUST BE THE LAST FILTER IN THE DEFINED CHAIN
         ===================================================== -->
    

    【讨论】:

    • 对不起,我想我应该给出完整的图片,我试图使用 ansible 模块在该块之前插入,但接受的正则表达式不允许我传递选项。此外,无论出于何种原因,不使用 python 正则表达式。尝试使用:docs.ansible.com/ansible/latest/modules/blockinfile_module.html 在正则表达式模式之前插入一个 xml 块,如上面所要求的。我已经更新了上面的问题以包含更多上下文
    • 听起来你的问题根本与 grep 或 bash 无关......
    • 除非我没有正确理解 grep,否则在这种情况下与 grep 一起使用的正则表达式应该与 ansible 正则表达式接受的语法相同。现在,如果这个假设是错误的,我可以改写上述请求。
    • Grep 的默认方言是 Posix BRE。它在几个传统的 Unix 工具中使用,但很少有其他工具使用它。你绝对应该仔细检查一下。 grep 也逐行匹配,因此默认情况下无法匹配多行模式
    • 这就是我的怀疑,听起来我需要找到一个支持多行正则表达式的模块。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多