l oop здесь не ваш друг и не lineinfile
. Вы хотите модуль replace
.
Следующее строит замещающую строку в переменную, а затем использует это:
---
- hosts: localhost
vars:
new_lines:
- "first line"
- "second line"
repl_str: '\1\n'
tasks:
- set_fact:
search_str: '([bcd]:)\n(?! - {{ new_lines[0] }})'
- set_fact:
repl_str: "{{ repl_str }} - {{ item }}\n"
with_items: "{{ new_lines }}"
- replace:
path: file.txt
regexp: "{{ search_str }}"
replace: "{{ repl_str }}"
Этот сборник пьес взял этот файл:
a:
b:
c:
d:
И сделал этот файл:
a:
b:
- first line
- second line
c:
- first line
- second line
d:
- first line
- second line
Этот бит строки поиска, (?! - {{ new_lines[0] }})
, делает идемпотент плейбука.