Каким модулем Ansible можно изменить строку в файле?

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

Ответ

Для модификации строк в файлах в 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, что дает больше контроля и читаемости.