Ansible XML 幂等地添加嵌套子级

问题描述 投票:0回答:1

我正在尝试修复 V-222934(Tomcat 默认 Servlet 参考中的其他信息)

web.xml
文件开始:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Much more in actual web.xml -->
</web-app>

我想以

结束
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
          <param-name>readonly</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Much more in actual web.xml -->
</web-app>

我从以下 Ansible 开始:

    - name: "V-222934: DefaultServlet set to readonly for PUT and DELETE"
      community.general.xml:
        path: "{{ atl_product_installation_versioned }}/conf/web.xml"
        xpath: "/j:web-app/j:servlet/j:servlet-class[text()=\"org.apache.catalina.servlets.DefaultServlet\"]"
        insertafter: yes
        add_children:
          - init-param:
            - param-name: readonly
            - param-value: true
        pretty_print: yes
        namespaces:
          j: http://xmlns.jcp.org/xml/ns/javaee

但这引发了一个错误,抱怨列表而不是字节/unicode。

切换到

input_type: xml
我取得了一些成功:

    - name: "V-222934: DefaultServlet set to readonly for PUT and DELETE"
      community.general.xml:
        path: "{{ atl_product_installation_versioned }}/conf/web.xml"
        xpath: "/j:web-app/j:servlet/j:servlet-class[text()=\"org.apache.catalina.servlets.DefaultServlet\"]"
        insertafter: yes
        input_type: xml
        add_children:
          - "<init-param><param-name>readonly</param-name><param-value>true</param-value></init-param>"
        pretty_print: yes
        namespaces:
          j: http://xmlns.jcp.org/xml/ns/javaee

这有效但不是无用的。

我的大/主要问题是:如何使其幂等?

我有一个小问题:如何让 yaml 输入类型正常工作? (我认为代码看起来更干净,并且通过这种格式更有意义。)

最后:我对命名空间的了解只够让 Ansible 工作。如果有人有更清晰/更清晰的代码编写方式,我愿意接受任何改进。

xml ansible namespaces idempotent
1个回答
0
投票

如果您想让您的任务幂等,只需构造一个与您要添加的内容匹配的 XPath 表达式即可。然后在

xpath
属性中使用它以及
state: present
– 可以省略,因为它是参数的默认值。

所以任务:

- xml:
    path: web.xml
    xpath: >-
      /ns:web-app
      /ns:servlet
      /ns:init-param[
      ns:param-name[text()="readonly"]
      and ns:param-value[text()="true"]
      ]
    pretty_print: true
    namespaces:
      ns: http://xmlns.jcp.org/xml/ns/javaee

您的 XML 最终成为

<?xml version='1.0' encoding='UTF-8'?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>readonly</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>
    <!-- Much more in actual web.xml -->
</web-app>
© www.soinside.com 2019 - 2024. All rights reserved.