Как добавить строки по шаблону от 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]
Другие вопросы по тегам