您可以使用 ansible 中的
replace
模块:
- name: Replace Module
replace: dest=<file-path-name> regexp='some_value' replace='{{ some_value }}' backup=no
如果可能的话,编辑您的文件,如下所示,这样会更容易替换:
<Products>
<Product productId="MetadataServer">some_value<product/>
<Product productId="DataQualityExceptionConsole" version="11.5.0.1"/>
</Products>
为该xml文件创建模板,并根据不同场景创建键值列表。当您执行 playbook 时,ansible 将使用变量键和相应的值替换模板中的所有变量。
例如
您想在开发和质量保证环境中安装tomcat。对于 Dev ,您使用端口 8080,对于 QA 环境,您使用端口 8081。 您可以使用 port_no 作为变量创建 server.xml 模板。 (小片段如下)。您可以添加任意数量的变量。
<Service name="Catalina">
<Connector port="{{ port_no }}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
这是一个使用 XML 模块 的演示,使用 ids 和值的字典在本地文件上进行测试:
剧本名为
xml-playbook.yml
:
- name: Edit XML file
hosts: 127.0.0.1
vars:
product_list:
- id: MetadataServer
value: 'value for MetadataServer'
- id: DataQualityExceptionConsole
value: 'value for DataQualityExceptionConsole'
tasks:
- name: Change values for product IDs
community.general.xml:
path: "products.xml"
xpath: "/Products/Product[@productId='{{ item.id }}']"
value: "{{ item.value }}"
with_items: "{{ product_list }}"
文件
products.xml
:
<Products>
<Product productId="MetadataServer"> {{ some_value }} <product/>
<Product productId="DataQualityExceptionConsole" version="11.5.0.1"/>
</Products>
运行后文件
ansible-playbook --connection=local --inventory 127.0.0.1, xml-playbook.yml
:
<Products>
<Product productId="MetadataServer">value for MetadataServer</Product>
<Product productId="DataQualityExceptionConsole" version="11.5.0.1">value for DataQualityExceptionConsole</Product>
</Products>