Zamień wiersz w pliku na Ansible, upewniając się, że jest obecny


Używam Ansible i muszę zamienić wiersz w pliku. To jest plik konfiguracyjny Logrotate dla Apache.
/etc/logrotate.d/apache2
... Przed zmianą - mówi linia
/var/log/apache2/*.log {

którym chcę zastąpić
/var/log/apache2/*.log/var/log/apache2/*/*.log {

Wolałbym nie nadpisywać całego pliku, aby nie wpływać na zawartość pliku config.
Mogę to zrobić
       lineinfile
moduł:
- 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 {'

Niestety, to zadanie powiedzie się (bez żadnej akcji), jeśli wyrażenie regularne nie pasuje do pliku konfiguracyjnego. Wolałbym, żeby się nie udało.
Rozwiązanie, które znalazłem to sprawdzenie konfiguracji dodatkowym zadaniem:
- name: Check logrotate’s configuration for Apache
command: egrep '^/var/log/apache2/\*\.log/var/log/apache2/\*/\*\.log {$'/etc/logrotate.d/apache2
changed_when: no

Wydaje się, że to działa, ale nie jestem zadowolony z duplikatu wyrażenia regularnego ...
Czy jest lepszy sposób na zmianę linii w przypadku awarii, jeśli jej brakuje?
Zauważ, że obecnie utknąłem na (dość starym) Ansible 2.2, ale nadal jestem zainteresowany rozwiązaniami, które działają z nowszymi wersjami.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pytanie:

„Przed zmianą, mówi linia
/var/log/apache2/*.log {

którym chcę zastąpić
/var/log/apache2/*.log/var/log/apache2/*/*.log {

O: Poniższe zadanie spełnia swoje zadanie

lineinfile
https://docs.ansible.com/ansib ... .html
- lineinfile:
path:/etc/logrotate.d/apache2
regexp: '^(/var/log/apache2/\*\.log)\s+{$'
line: '\1/var/log/apache2/*/*.log {'
backrefs: yes
Pytanie:

„Czy istnieje lepszy sposób na zmianę linii w przypadku awarii, jeśli jej brakuje?”
O: Poniższe zadanie kończy się niepowodzeniem, gdy

szablon

nie w pliku konfiguracyjnym
  - 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 {'

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się