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

Замените строку в файле на Ansible, убедившись, что эта строка присутствует

Я использую Ansible, и мне нужно заменить строку в файле. Это файл конфигурации logrotate для apache. /etc/logrotate.d/apache2. Перед изменением в строке написано

/var/log/apache2/*.log {

который я хочу заменить на

/var/log/apache2/*.log /var/log/apache2/*/*.log {

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

Я могу сделать это с lineinfile модуль:

- name: Configure logrotate for Apache
  lineinfile:
    dest: /etc/logrotate.d/apache2
    regexp: '^(/var/log/apache2/\*\.log) (?:/var/log/apache2/\*/\*\.log )?{$'
    # The backrefs option is required to ensure the line won’t just be 
    # added, breaking the syntax of the file…
    backrefs: yes
    line: '\1 /var/log/apache2/*/*.log {'

К сожалению, эта задача завершается успешно (без каких-либо действий), если регулярное выражение не соответствует в файле конфигурации. Я бы предпочел, чтобы он потерпел неудачу.

Решение, которое я нашел, - это проверить конфигурацию с помощью дополнительной задачи:

- name: Check logrotate’s configuration for Apache
  command: egrep '^/var/log/apache2/\*\.log /var/log/apache2/\*/\*\.log {$' /etc/logrotate.d/apache2
  changed_when: no

Кажется, это работает, но меня не устраивает дублирование регулярного выражения ...

Есть ли лучший способ изменить строку при сбое, если эта строка отсутствует?

Обратите внимание, что в настоящее время я застрял на (довольно древнем) Ansible 2.2, но меня все еще интересуют решения, которые работают с более новыми версиями.

Вопрос: "Перед изменением в строке написано

/var/log/apache2/*.log {

который я хочу заменить на

/var/log/apache2/*.log /var/log/apache2/*/*.log {

A: Задача ниже выполняет свою работу с lineinfile

- lineinfile:
    path: /etc/logrotate.d/apache2
    regexp: '^(/var/log/apache2/\*\.log)\s+{$'
    line: '\1 /var/log/apache2/*/*.log {'
    backrefs: yes

Вопрос: «Есть ли лучший способ изменить строку при сбое, если эта строка отсутствует?»

A: Задача ниже не выполняется, когда шаблон нет в файле конфигурации

   - fail:
        msg: Pattern not in file
      when: not lookup('file', my_conf).splitlines()|
            select('match', pattern)|list
      vars:
        pattern: '^/var/log/apache2/\*\.log\s+{$'
        my_conf: '/etc/logrotate.d/apache2'

   - replace:
       path: /etc/logrotate.d/apache2
       regexp: '^(/var/log/apache2/\*\.log)\s+{$'
       replace: '\1 /var/log/apache2/*/*.log {'