Определение
Для управления содержимым файлов есть 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