Я использую 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 {'