Как добавить строки по шаблону от ansible playbook
У меня есть проверка имени файла
[tag1]
[tag2]
Я хочу добавить строки после [tag1] в тесте, я нахожу это решение
- name: Add content
lineinfile:
path: test
insertafter: '[tag1]'
line: "{{ item }}"
with_items:
- '# This is line 1'
- '# This is line 2'
- '# This is line 3'
Но он добавляет эти строки в конец файла, а не после [tag1]. И если я запускаю playbook дважды, он добавляет его 2 раза. Я хочу проверить, не существует ли этих строк после того, как [tag1] добавит их, и если они существуют, ничего не делать.
Что я должен делать? Почему он добавил строки в конце файла?
1 ответ
lineinfile не соответствует. Смотри lineinfile не идемпотент # 58923.
Это вызвано ошибкой в логике первого матча. Эта ошибка присутствует в devel вплоть до Ansible 2.5 ...
В задаче ниже
- lineinfile:
path: test
insertafter: '[tag1]'
firstmatch: yes
line: "{{ item }}"
loop:
- '# This is line 1'
параметр firstmatch: yes
помогает поставить line
до [tag2]
$ cat test
[tag1]
# This is line 1
[tag2]
, но когда воспроизведение повторяется, тот же параметр вызывает line
быть добавленным повторно. (Не стесняйтесь попробовать.)
Вместо этого используйте ini_file. Задача ниже
- ini_file:
path: test
section: "{{ item.section }}"
option: "{{ item.option }}"
allow_no_value: yes
loop:
- section: 'tag1'
option: '# This is line 1'
- section: 'tag1'
option: '# This is line 2'
дает идемпотентный результат.
$ cat test
[tag1]
# This is line 2
# This is line 1
[tag2]