Ответ
Для модификации строк в файлах в Ansible я в основном использую два модуля: lineinfile и replace. Выбор зависит от конкретной задачи.
Модуль lineinfile
Идеален, когда нужно гарантировать наличие одной конкретной строки в файле, заменив её или добавив, если она отсутствует. Он работает со строками, соответствующими регулярному выражению.
Пример: Убедиться, что в sshd_config отключен root-логин.
- name: Disable SSH root login
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin no'
state: present
backup: yes # Создать резервную копию файла
Модуль replace
Используется, когда нужно заменить все вхождения определенного текста или паттерна в файле. Он работает с содержимым файла более глобально.
Пример: Заменить устаревший URL API во всех конфигурационных файлах.
- name: Update API endpoint in config
ansible.builtin.replace:
path: /etc/app/config.properties
regexp: 'api.old-domain.com'
replace: 'api.new-domain.com'
Краткое сравнение и рекомендация:
lineinfile: "Убедись, что эта строка в файле выглядит именно так". Подходит для управления отдельными строками в конфигах (например,sysctl.conf,limits.conf).replace: "Найди и замени этот текст везде, где встретишь". Подходит для массовых замен или когда точное местоположение строки неизвестно.
Для сложных, многострочных замен или полной перезаписи файлов я предпочитаю использовать шаблоны (template модуль) с файлами Jinja2, что дает больше контроля и читаемости.