![Ansible 替换:正则表达式/替换跨越多行?](https://linux22.com/image/737532/Ansible%20%E6%9B%BF%E6%8D%A2%EF%BC%9A%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%2F%E6%9B%BF%E6%8D%A2%E8%B7%A8%E8%B6%8A%E5%A4%9A%E8%A1%8C%EF%BC%9F.png)
在 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>'
将量词改为惰性量词。