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

Ansible regex неправильно добавлять блок в файл

Я бы хотел добавить блок между <IfModule mod_ssl.c> и </IfModule> в /etc/apache2/mods-available/ssl.conf с помощью недоступной задачи, показанной ниже. я использую blockinfile и insertbefore.

К сожалению, блок всегда добавляется после </IfModule> внизу файла. Я предполагаю, что мое регулярное выражение неверно.

- name: Apache2 > update SSL conf
  become: yes
  blockinfile:
    path: /etc/apache2/mods-available/ssl.conf
    block: |
      # Requires Apache >= 2.4
      SSLCompression off
      SSLUseStapling on
      SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

      # Requires Apache >= 2.4.11
      SSLSessionTickets Off

      Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
      Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
    marker: ""
    insertbefore: '^<\/IfModule>'
  notify:
    - Restart apache2

Я безуспешно пробовал следующее регулярное выражение:

insertbefore: '/^<\/IfModule>/m'
insertbefore: "<\/IfModule>"
insertbefore: "</IfModule>"
insertbefore: "</IfModule> "
insertbefore: '^<\/IfModule>$'
insertbefore: "&lt;/IfModule&gt;"
insertbefore: '(?m)^<\/IfModule>\\s?$'
insertbefore: '^</IfModule>\s?$'

Я был бы очень благодарен, если бы кто-нибудь помог мне исправить мое регулярное выражение. Спасибо.

Короткий рассказ:
регулярное выражение победителя insertbefore: "^</IfModule>\\s?$"

Длинная история:
У меня появилась еще одна идея, как все сделать:
- сначала одно задание на удаление </IfModule> внизу файла
- во-вторых, одна задача по добавлению блока внизу файла
- в-третьих, одна задача добавить </IfModule> внизу файла

Написал первую новую задачу:

- name: Apache2 > Removes </IfModule>
  become: yes
  lineinfile:
    dest: /etc/apache2/mods-available/ssl.conf
    regexp: "^</IfModule>\\s?$"
    state: absent

и я понял, что только что написал правильное регулярное выражение ... Моя ошибка заключалась в том, чтобы сбежать /.
:-)

Правильная задача, которая управляет всем сама:

- name: Apache2 > update SSL conf
  become: yes
  blockinfile:
    path: /etc/apache2/mods-available/ssl.conf
    block: |
      # Requires Apache >= 2.4
      SSLCompression off
      SSLUseStapling on
      SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

      # Requires Apache >= 2.4.11
      SSLSessionTickets Off

      ## HSTS (mod_headers is required) (15768000 seconds = 6 months)
      Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"

      ## Transmit cookies over secure connection only
      Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
    insertbefore: "^</IfModule>\\s?$"
  notify:
    - Restart apache2

Комментарий Anx заставил меня вернуть маркеры blockinfile, чтобы задача оставалась идемпотентной.

Я сделал это для примера регулярного выражения в блокируемом файле

- name: 'NTP configuration for REHEL6 or CentOS6 or SUSE'
   blockinfile:
     path: /etc/ntp.conf
     insertafter: '^# Please'
     block: |
      server 10.121.127.12 iburst
      server 10.122.127.13 iburst
   when: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or (ansible_facts['distribution'] == "RedHat" and ansible_facts['distribution_major_version'] == "6")