Что делает модуль lineinfile в Ansible и когда его стоит использовать?

«Что делает модуль lineinfile в Ansible и когда его стоит использовать?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модуль 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-шаблона, что дает полный контроль и лучшую читаемость.