Ansible 替换:正则表达式/替换跨越多行?

Ansible 替换:正则表达式/替换跨越多行?

在 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>'

将量词改为惰性量词。

相关内容