Определение

Для управления содержимым файлов есть 5 основных модулей:

  • ansible.builtin.lineinfile — управляет строками в файле
  • ansible.builtin.blockinfile — управляет блоком строк в файле (отделяет их с двух сторон)
  • ansible.builtin.template — заменяет файл Jinja2 шаблоном
  • ansible.builtin.copy — заменяет файл содержимым
  • ansible.builtin.replace — заменяет все строки, попадающие под регулярное выражение

Разберем преимущества и недостатки каждого из них

ansible.builtin.lineinfile

Плюсы: Позволяет гибко и точно создавать или удалять нужные строки в нужном месте Минусы: Если изменить line: после ее добавления, при повторном запуске Ansible не сможет отследить предыдущую строку и оставит ее (в итоге получится 2 строки)

ansible.builtin.blockinfile

Плюсы: Позволяет удобно отслеживать начинаются и заканчиваются изменения, которые выполнил Ansible при помощи маркера (строки для маркировки можно изменить через параметры marker_begin и marker_end), также можно не беспокоиться о добавленных ранее строках, поскольку Ansible будет работать исключительно в рамках блока Минусы: Не позволяет добавлять что-то отдельно от блока, при повторном запуске с другими данными заменяет имеющийся блок на новый

ansible.builtin.template

Плюсы: Позволяет гибко настраивать файл конфигурации используя весь арсенал Jinja2 шаблонов, также умеет создавать маркер аналогично модулю ansible.builtin.blockinfile, подробнее в посте про ansible_managed Минусы: По умолчанию полностью заменяет файл (force: true), не предназначен для изменения уже имеющихся файлов

ansible.builtin.copy

Плюсы: Не требует создания Jinja2 шаблона, интуитивно понятный Минусы: По умолчанию полностью заменяет файл (force: true), при интерполяции может привести к непредсказуемым результатам

ansible.builtin.replace

Плюсы: Позволяет заменить разом несколько строк в одном файле Минусы: По неосторожности можно случайно изменить строки, которые не нужно менять, также не умеет точечно добавлять нужные строки

Best-practice

Когда и какой применять:

  • Если нужно заменить строку/строки в существующем файле, то лучше использовать ansible.builtin.lineinfile
  • Если нужно добавить блок со строками в существующий файл с возможностью маркировки изменений, то лучше использовать ansible.builtin.blockinfile
  • Если нужно заменить файл каким-то простым содержимым, то лучше использовать ansible.builtin.copy
  • Если нужно динамически создавать файл и/или изменять его, то лучше использовать ansible.builtin.template
  • Если нужно заменить все строки согласно какому-то регулярному выражению, то лучше использовать ansible.builtin.replace