Назад | Перейти на главную страницу

Ansible replace: регулярное выражение / замена нескольких строк?

В анзибле я бы хотел заменить это:

  <sadmin>
    <user>admin@localhost</user>
  </sadmin>

с этим:

<sadmin>
   <user>user1@somedomain</user>
   <user>user2@somedomain</user>
   <user>user3@somedomain</user>
 </sadmin>

Я пробовал использовать модуль замены, но не знаю, может ли регулярное выражение охватывать несколько строк (как мне использовать необработанную нотацию 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>' }

Представленная ниже игра делает то, что требуется.

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