Как добавить большой объем текста в файл с помощью Ansible?

Наше приложение создает много определений в /etc/services, Мы держим services файл со всеми этими определениями, так что мы можем просто передать их в /etc/services как это:

cp /etc/services /etc/services.stock
cat /path/to/build/services >> /etc/services

Это работает, но не идемпотентно, т. Е. Многократный запуск этих команд приведет к тому, что к файлу сервисов снова добавится информация.

Работая с нашими сборниками пьес Ansible, я пытаюсь понять, как это сделать. Я мог бы так что-то вроде этого:

- command: "cat /path/to/build/services >> /etc/services"

но я не хочу, чтобы он запускался каждый раз, когда я запускаю playbook.

Другой вариант - сделать что-то вроде этого:

- name: add services
  lineinfile: 
    state: present
    insertafter: EOF
    dest: /etc/services
    line: "{{ item }}"
  with_items:
   - line 1
   - line 2
   - line 3
   - line 4
   - ...

но это действительно медленно, потому что это делает каждую строку в отдельности.

Есть ли способ лучше? Шаблоны не помогают, потому что они полностью перезаписывают файл служб, что кажется немного грубым.

1 ответ

Решение

blockinfile является родным идемпотентным модулем, обеспечивающим наличие (отсутствие) указанного файла в файле.

Пример:

- name: add services
  blockinfile: 
    state: present
    insertafter: EOF
    dest: /etc/services
    marker: "<!-- add services ANSIBLE MANAGED BLOCK -->"
    content: |
      line 1
      line 2
      line 3
Другие вопросы по тегам