我正在尝试修复 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 工作。如果有人有更清晰/更清晰的代码编写方式,我愿意接受任何改进。
如果您想让您的任务幂等,只需构造一个与您要添加的内容匹配的 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>