在 ansible 中,我想替换这个:
<sadmin>
<user>admin@localhost</user>
</sadmin>
有了这个:
<sadmin>
<user>user1@somedomain</user>
<user>user2@somedomain</user>
<user>user3@somedomain</user>
</sadmin>
我尝试使用 replace 模块,但不知道正则表达式是否可以跨越多行(如何使用 python 原始符号表示换行符?)。我尝试了该xml
模块,但我认为这实际上不是一个 XML 文件,因为它一直在文件顶部添加标题<?xml version='1.0' encoding='UTF-8'?>
。我该怎么做?最好使用模板吗?
- name: add replacements to jabber config files
replace:
path : "/etc/jabberd2/{{ item.path }}"
regexp : "{{ item.regex }}"
replace: "{{ item.replace }}"
with_items:
- { path: 'muc.xml', regex: 'conference.localhost', replace: 'conference.mydomain' }
- { path: 'muc.xml', regex: '<sadmin>.*</sadmin>', replace: '<sadmin><user>user1@somedomain</user>\n<user>user2@somedomain</user></sadmin>' }
答案1
下面的剧本按照要求进行
- replace:
path: test.xml
regexp: '<user>admin@localhost<\/user>'
replace: |-
<user>user1@somedomain</user>
<user>user2@somedomain</user>
<user>user3@somedomain</user>
下面的示例展示了如何替换整个管理员部分
- replace:
path: test.xml
regexp: '(<sadmin>[\s\S]*)</sadmin>'
replace: |-
<sadmin>
<user>user1@somedomain</user>
<user>user2@somedomain</user>
<user>user3@somedomain</user>
</sadmin>
答案2
要小心使用贪婪量词 '*',如果有多个 '' 部分,则可能需要使用问号
regexp: '(<sadmin>[\s\S]*?)</sadmin>'
将量词改为惰性量词。