Как добавить большой объем текста в файл с помощью 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