Я использую модуль замены для замены всей строки в Ansible. Строка содержит двойные и одинарные кавычки. Я попытался добавить «\\», чтобы избежать их, но, похоже, это не сработало. Может ли кто-нибудь помочь мне с правильным синтаксисом? Фактическая строка в файле по умолчанию установлена ​​​​на

<!-- <param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE'" /> -->

Мне нужно раскомментировать его и заменить разделы db переменной Postgres DB-info.

- name: "Update switch.conf.xml with Postgres DB info"
  replace:
    path: /etc/freeswitch/autoload_configs/switch.conf.xml
    regexp: '^<!-- <param name="core-db-dsn" value="pgsql: .*$'
    line: "<param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname={{ DB-Info }} user={{ DB-Info
              }} password='{{ DB-Pass }}' options='-c client_min_messages=NOTICE'" />"                          
0
user2236794 17 Сен 2020 в 00:33
«DB-Pass» и «DB-Info» не являются допустимыми переменными. Замените тире «-» символом подчеркивания «_».
 – 
Vladimir Botka
17 Сен 2020 в 06:48
Модуль replace заменит все вхождения regexp в файле. Если это не то, что вы хотите, используйте вместо этого 'lineinfile'.
 – 
Vladimir Botka
17 Сен 2020 в 07:06

1 ответ

Есть больше вариантов. Чтобы избежать экранирования сложных выражений, поместите их в файлы. Например, поместите регулярное выражение и строки в набор файлов (r*,l*).

shell> cat files/replace/r1 
^<!-- <param name="core-db-dsn" value="pgsql:(.*)$
shell> cat files/replace/l1 
<param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname={{ DB_Info }} user={{ DB_Info }} password='{{ DB_Pass }}' options='-c client_min_messages=NOTICE'" />

Тогда задача ниже выполняет свою работу

  - replace:
      path: switch.conf.xml
      regexp: "{{ lookup('file', 'files/replace/r1') }}"
      replace: "{{ lookup('template', 'files/replace/l1') }}"
    vars:
      DB_Info: freeswitch2
      DB_Pass: passwd

Если файлов больше, запустите задачу в цикле. Например

  - replace:
      path: switch.conf.xml
      regexp: "{{ lookup('file', 'files/replace/r' ~ ansible_loop.index ) }}"
      replace: "{{ lookup('template', 'files/replace/l' ~ ansible_loop.index) }}"
    loop: "{{ lookup('fileglob', 'files/replace/r*', wantlist=True) }}"
    loop_control:
      extended: true
    vars:
      DB_Info: freeswitch2
      DB_Pass: passwd

Убедитесь, что 'glob' соответствует только тому, что вы хотите. Удалите все временные или резервные файлы. Цикл ожидает набор (r*,l*) файлов с непрерывным индексом, начинающимся с 1.


Чтобы избежать обслуживания слишком большого количества (r*,l*) файлов, поместите все регулярные выражения и строки в отдельные файлы и зациклируйте строки файлов. Например

    - replace:
        path: switch.conf.xml
        regexp: "{{ item.0 }}"
        replace: "{{ item.1 }}"
      with_together:
        - "{{ lookup('file', 'files/replace/r-all').splitlines() }}"
        - "{{ lookup('template', 'files/replace/l-all').splitlines() }}"
      loop_control:
        label: "{{ item.0 }}"
      vars:
        DB_Info: freeswitch2
        DB_Pass: passwd
0
Vladimir Botka 17 Сен 2020 в 09:50