использование lineinfile для вставки строки, но не работает должным образом

Я использую lineinfileдля вставки строки в файл системного журнала. Вот мой системный журнал:

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

Я бы хотел добавить compress а также delaycompress после missingok. Вот мой код:

- name: "Adding compress line in /etc/logrotate.d/syslog"
  lineinfile:
    path: /etc/logrotate.d/syslog
    insertafter: "^missingok"
    line: "    compress"
    firstmatch: yes
    state: present

- name: "Adding delaycompress line in /etc/logrotate.d/syslog"
  lineinfile:
    path: /etc/logrotate.d/syslog
    insertbefore: "^sharedscripts"
    line: "    delaycompress"
    firstmatch: yes
    state: present

Но это добавление обоих в конец файла (в последних строках).
Примечание: я добавил 4 пробела передcompress а также delaycompress.

1 ответ

Решение

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

И потому что у вас есть пробелы перед missingok а также sharedscripts, ваш insertafter а также insertbeforeрегулярное выражение ничего не соответствует.

Чтобы исправить это, вы можете разрешить пробелы и пробелы только в начале строки с помощью \s который соответствует любому пробелу, символу табуляции или новой строки и звездочке * который соответствует нулю или более последовательных символов.

Итак, правильное регулярное выражение было бы

И исправление для ваших задач будет:

- name: "Adding compress line in /etc/logrotate.d/syslog"
  lineinfile:
    path: /etc/logrotate.d/syslog
    insertafter: "^\\s*missingok"
    line: "    compress"
    firstmatch: yes
    state: present

- name: "Adding delaycompress line in /etc/logrotate.d/syslog"
  lineinfile:
    path: /etc/logrotate.d/syslog
    insertbefore: "^\\s*sharedscripts"
    line: "    delaycompress"
    firstmatch: yes
    state: present

Обратите внимание: поскольку Ansible - это приложение Python, обратная косая черта\имеют особое значение и от них нужно избавляться.

Другие вопросы по тегам