Ответ
Модуль lineinfile — это утилитарный модуль Ansible для управления отдельными строками в текстовых файлах на удаленных хостах. Он идеально подходит для точечных изменений в конфигурационных файлах, когда нецелесообразно заменять весь файл шаблоном (template) или копировать его целиком (copy).
Типичные сценарии использования:
- Включение/отключение опции в конфиге (например,
PermitRootLoginвsshd_config). - Добавление строки в системные файлы (например, запись в
/etc/hostsили/etc/fstab). - Обновление версии пакета в файле требований (например, в
requirements.txtдля Python).
Базовый пример: отключение root-логина по SSH
- name: Disable SSH root login
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin' # Ищет строку, начинающуюся с 'PermitRootLogin' (с '#' или без)
line: 'PermitRootLogin no' # Заменяет её на эту точную строку
state: present
backup: yes # Создает резервную копию файла перед изменением
notify: restart sshd # Вызывает handler для перезапуска службы
Ключевые параметры для точного контроля:
insertafter/insertbefore: Позволяют вставить строку относительно другой строки (по совпадению или EOF/BOF). Полезно, когда важно местоположение.- name: Add nameserver after a specific line lineinfile: path: /etc/resolv.conf insertafter: '^# Generated by NetworkManager' line: 'nameserver 8.8.8.8'state: absent: Удаляет строки, соответствующиеregexp.validate: Позволяет выполнить проверку команды перед сохранением файла (например,validate: 'nginx -t -c %s'для проверки конфига Nginx).
Важное замечание: Для управления целыми секциями конфигурационных файлов (например, блоками в nginx.conf) модуль lineinfile может стать громоздким. В таких случаях предпочтительнее использовать модуль template для генерации всего файла из Jinja2-шаблона, что дает полный контроль и лучшую читаемость.