lineinfile#

Модуль ansible.builtin.lineinfile управляет строками в файле на управляемом узле. Он ищет строку, соответствующую заданному регулярному выражению, и если находит, заменяет ее на указанную. Если строка не найдена, модуль добавляет новую строку в файл.

Особенности работы#

Модуль удобен для изменения или вставки одной конкретной строки.

Если необходимо изменить несколько похожих строк, используйте модуль ansible.builtin.replace.

Если необходимо вставить, обновить или удалить блок строк в файле, используйте модуль ansible.builtin.blockinfile.

Если необходимо заменить или создать файл целиком, используйте модули ansible.builtin.copy или ansible.builtin.template.

Параметры#

Модуль принимает следующие параметры:

attributes#

Изменение атрибутов файла, который содержит необходимую строку. Чтобы узнать о поддерживаемых атрибутах, обратитесь к руководству chattr в целевой системе:

man chattr

Значение этого параметра должно представлять собой строку, содержащую атрибуты в порядке, принятом в выводе lsattr на целевой системе. Строка также может включать один из следующих операторов:

  • = – установить строго указанный набор атрибутов;

  • + – добавить указанные атрибуты к существующим;

  • - – удалить указанные атрибуты из существующих.

Если оператор не указан, используется оператор =. Это значит, что будут сброшены все установленные ранее атрибуты, кроме явно указанных в строке.

backrefs#

Использование обратных ссылок на группы из регулярного выражения в строке замены.

Применяется только совместно с параметром state=present.

Не может быть применен с параметром search_string.

Возможные значения:

  • false – не использовать обратные ссылки.

  • true – использование обратных ссылок разрешено. Параметр line может содержать ссылки на группы, найденные при совпадении с регулярным выражением, указанным в параметре regexp. При этом параметры insertbefore и insertafter игнорируются.

Значение по умолчанию: false.

backup#

Создание резервной копии файла, указанного в path, включая метку времени.

Возможные значения:

  • false – не создавать резервную копию;

  • true – создать резервную копию и только потом заменить существующий файл на файл с измененной строкой.

Значение по умолчанию: false.

create#

Создание файла, если он отсутствует.

Применяется только совместно с параметром state=present. Без этого параметра выполнение завершится ошибкой, если файл не существует.

Возможные значения:

  • false – не создавать файл и завершить выполнение задачи с ошибкой;

  • true – создать файл.

Значение по умолчанию: false.

firstmatch#

Использование первого совпадения с регулярным выражением при вставке строки.

Применяется совместно с параметром insertbefore или insertafter.

Возможные значения:

  • false – использовать последнее совпадение;

  • true – использовать первое совпадение.

Значение по умолчанию: false.

group#

Название группы, которой будет принадлежать изменяемый файл. Параметр работает как утилита chown.

Если значение не задано, используется основная (primary) группа пользователя, от имени которого выполняется задача. При выполнении задачи с привилегиями root предыдущая группа-владелец может быть сохранена.

insertafter#

Регулярное выражение, после последнего совпадения с которым необходимо вставить строку, указанную в параметре line.

Если значение не указано или совпадений не найдено, используется специальное значение EOF – вставить строку в конец файла.

Параметр insertafter учитывается только в том случае, если не найдено совпадение с регулярным выражением, указанным в regexp.

Применяется только совместно с параметром state=present.

Не может быть применен с параметром insertbefore или backrefs.

insertbefore#

Регулярное выражение, перед последним совпадением с которым необходимо вставить строку, указанную в параметре line.

Если совпадений не найдено, строка будет вставлена в конец файла.

Доступно специальное значение BOF – вставить строку в начало файла.

Параметр insertbefore учитывается только в том случае, если не найдено совпадение с регулярным выражением, указанным в regexp.

Применяется только совместно с параметром state=present.

Не может быть применен с параметром insertafter или backrefs.

line, value#

Строка, которую необходимо вставить или заменить.

Обязательный параметр при использовании параметра state=present.

При использовании совместно с параметром backrefs, в этой строке могут использоваться обратные ссылки на захваченные группы из регулярного выражения, указанного в параметре regexp.

mode#

Режим доступа к изменяемому файлу.

Значения могут быть следующих типов:

  • Восьмеричное число, например, 0644 или 0755. Обязательно указывать с ведущим нулем или в кавычках:

    • 0644;

    • '644'.

    Если указать значение без кавычек или ведущего нуля, Ansible обработает его как десятичное число, что приведет к непредсказуемому результату.

  • Строковое значение, например, u=rw,g=r,o=r или u+rwx,g+rx,o=r.

Поведение по умолчанию:

  • если файл уже существует, режим доступа сохраняется;

  • если файл не существует, режим доступа определяется системным значением umask на управляемом узле.

Предупреждение

Рекомендуется всегда явно задавать значение параметра mode, чтобы избежать назначения небезопасных или непредсказуемых режимов доступа. См. описание уязвимости CVE-2020-1736.

owner#

Название учетной записи пользователя, которому будет принадлежать изменяемый файл. Параметр работает как утилита chown.

Если значение параметра не указано, владельцем становится активный пользователь. При выполнении задачи с привилегиями root предыдущий владелец будет сохранен.

Если используется числовое значение, владельцем становится пользователь с указанным идентификатором. Во избежание непредсказуемых назначений избегайте числовых значений.

path, dest, destfile, name#

Путь к изменяемому файлу.

regexp, regex#

Регулярное выражение для поиска изменяемой строки.

Если параметр state=present, определяет строку, которую необходимо заменить. Только последняя найденная строка будет заменена.

Если параметр state=absent, определяет строки, которые необходимо удалить.

Если совпадение не обнаружено, строка будет добавлена согласно параметру insertbefore или insertafter.

Для обеспечения идемпотентности (чтобы повторный запуск не изменял файл) регулярное выражение должно находить как исходное состояние строки, так и ее измененное состояние после замены.

Подробную информацию о синтаксисе регулярных выражений см. в документации Python.

Не может быть применен с параметром search_string.

search_string#

Буквальная строка, которую необходимо найти. Необязательно, чтобы она совпадала со всей строкой.

Если параметр state=present, определяет строку, которую необходимо заменить. Только последняя найденная строка будет заменена.

Если параметр state=absent, определяет строки, которые необходимо удалить.

Если совпадения не найдено, строка будет добавлена согласно параметру insertbefore или insertafter.

Не может быть применен с параметром regexp или backrefs.

selevel#

Уровень изменяемого файла в контексте безопасности SELinux.

Представляет собой MLS/MCS-атрибут, также известный как range, который задает уровень доступа к объекту в системе с включенным SELinux.

Если установлено значение _default, будет использован уровень по умолчанию из политики SELinux для данного файла (если такая политика определена).

serole#

Роль изменяемого файла в контексте безопасности SELinux.

Если установлено значение _default, будет использована роль по умолчанию из политики SELinux для данного файла (если такая политика определена).

setype#

Тип изменяемого файла в контексте безопасности SELinux.

Если установлено значение _default, будет использован тип по умолчанию из политики SELinux для данного файла (если такая политика определена).

seuser#

Пользователь изменяемого файла в контексте безопасности SELinux.

Если значение не указано, используется системная политика определения пользователя.

Если установлено значение _default, будет использован пользователь по умолчанию из политики SELinux для данного файла (если такая политика определена).

state#

Требуемое состояние строки.

Возможные значения:

  • absent – строка должна быть удалена;

  • present – строка должна присутствовать.

Значение по умолчанию: present.

unsafe_writes#

Использование атомарной записи для предотвращения повреждения данных или несогласованного чтения целевого файлового объекта.

По умолчанию модуль использует атомарные операции записи, при которых данные сначала записываются во временный файл, а затем временный файл заменяет целевой. Это исключает возможность считывания неполных или поврежденных данных другим процессом во время записи.

На некоторых системах (например, при работе с томами Docker) атомарные операции могут быть недоступны или вызывать ошибки. В этом случае установка значения true позволяет Ansible выполнить небезопасную (неатомарную) запись напрямую в целевой файл.

Предупреждение

Небезопасная запись может привести к состоянию гонки и повреждению данных.

Возможные значения:

  • false – атомарные операции обязательны. При их невозможности задача завершится с ошибкой.

  • true – если атомарная запись невозможна, будет использован небезопасный способ записи.

Значение по умолчанию: false.

validate#

Шаблон команды для проверки корректности изменяемого файла.

Путь к файлу подставляется автоматически вместо последовательности символов %s, которая должна присутствовать в шаблоне. Если проверка проходит без ошибок, собранный файл размещается по пути, указанному в path. В противном случае задача завершается с ошибкой.

Команда запускается безопасно, поэтому расширения оболочки и конвейеры (pipes) не будут работать.

Атрибуты#

Атрибуты определяют функции Ansible, которые может использовать модуль.

Атрибут

Описание

check_mode

Модуль работает в режиме проверки (check_mode) в полном объеме.

diff_mode

Модуль не поддерживает режим сравнения.

platform

Модуль поддерживает только POSIX-совместимые ОС.

safe_file_operations

Модуль использует строгие механизмы работы с файлами Ansible для обеспечения правильных разрешений и предотвращения повреждения данных.

vault

Модуль не поддерживает автоматическую расшифровку исходных файлов с использованием хранилища секретов.

Примеры#

Для изучения возможностей модуля ознакомьтесь с приведенными ниже примерами.

Изменение переменной SELinux#

Следующий пример демонстрирует изменение значения переменной SELinux на enforcing в конфигурационном файле:

---
# ...
  tasks:
    - name: Ensure SELinux is set to enforcing mode
      ansible.builtin.lineinfile:
        path: /etc/selinux/config
        regexp: '^SELINUX='
        line: SELINUX=enforcing

Удаление строки#

Следующий пример демонстрирует удаление строки, соответствующей шаблону ^%wheel, из файла /etc/sudoers:

---
# ...
  tasks:
    - name: Make sure group wheel is not in the sudoers configuration
      ansible.builtin.lineinfile:
        path: /etc/sudoers
        state: absent
        regexp: '^%wheel'

Замена строки с использованием regexp#

Следующий пример демонстрирует замену строки с IP-адресом 127.0.0.1 в файле /etc/hosts и установку прав и владельца файла:

---
# ...
  tasks:
    - name: Replace a localhost entry with our own
      ansible.builtin.lineinfile:
        path: /etc/hosts
        regexp: '^127\.0\.0\.1'
        line: 127.0.0.1 localhost
        owner: root
        group: root
        mode: '0644'

Замена строки без regexp#

Следующий пример демонстрирует замену строки с подстрокой 127.0.0.1 без использования регулярных выражений:

---
# ...
  tasks:
    - name: Replace a localhost entry searching for a literal string to avoid escaping
      ansible.builtin.lineinfile:
        path: /etc/hosts
        search_string: '127.0.0.1'
        line: 127.0.0.1 localhost
        owner: root
        group: root
        mode: '0644'

Вставка новой строки после комментария#

Следующий пример демонстрирует вставку строки Listen 8080 после комментария #Listen в конфигурационном файле Apache:

---
# ...
  tasks:
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
        path: /etc/apache2/ports.conf
        regexp: '^Listen '
        insertafter: '^#Listen '
        line: Listen 8080

Изменение шаблона расширений#

Следующий пример демонстрирует изменение строки с шаблоном <FilesMatch ".php[45]?$"> на новую строку с другим шаблоном расширений:

---
# ...
  tasks:
    - name: Ensure php extension matches new pattern
      ansible.builtin.lineinfile:
        path: /etc/apache2/apache2.conf
        search_string: '<FilesMatch ".php[45]?$">'
        insertafter: '^\t<Location \/>\n'
        line: '        <FilesMatch ".php[34]?$">'

Вставка новой строки перед комментарием#

Следующий пример демонстрирует добавление комментария перед строкой, начинающейся с www и содержащей порт 80/tcp:

---
# ...
  tasks:
    - name: Ensure we have our own comment added to /etc/services
      ansible.builtin.lineinfile:
        path: /etc/services
        regexp: '^# port for http'
        insertbefore: '^www.*80/tcp'
        line: '# port for http by default'

Создание нового файла#

Следующий пример демонстрирует создание файла, если он отсутствует, и добавление в него единственной строки:

---
# ...
  tasks:
    - name: Add a line to a file if the file does not exist, without passing regexp
      ansible.builtin.lineinfile:
        path: /tmp/testfile
        line: 192.168.1.99 foo.lab.net foo
        create: true

Использование подстановок#

Следующий пример демонстрирует замену строки в конфигурационном файле JBoss с использованием групп захвата и обратных ссылок. Регулярное выражение выделяет отдельные части строки с настройками памяти, а затем эти части подставляются в итоговую строку, чтобы изменить только параметр Xms, сохранив остальное без изменений:

---
# ...
  tasks:
    - name: Ensure the JBoss memory settings are exactly as needed
      ansible.builtin.lineinfile:
        path: /opt/jboss-as/bin/standalone.conf
        regexp: '^(.*)Xms(\d+)m(.*)$'
        line: '\1Xms${xms}m\3'
        backrefs: true

Проверка синтаксиса#

Следующий пример демонстрирует проверку синтаксиса файла /etc/sudoers перед применением изменений с помощью команды visudo:

---
# ...
  tasks:
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%ADMIN ALL='
        line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
        validate: /usr/sbin/visudo -cf %s

Если строка, начинающаяся с %ADMIN ALL=, уже присутствует, она будет заменена на следующую строку:

%ADMIN ALL=(ALL) NOPASSWD: ALL

Если такой строки нет, она будет добавлена в конец файла.

Использование альтернативного синтаксиса групп#

Следующий пример демонстрирует замену части строки в файле с сохранением ее начальной части. При этом используется альтернативная форма записи группы захвата (\g<1>) для избежания конфликтов с подстановкой переменных Ansible:

---
# ...
  tasks:
    - name: Use backrefs with alternative group syntax to avoid conflicts with variable values
      ansible.builtin.lineinfile:
        path: /tmp/config
        regexp: ^(host=).*
        line: \g<1>{{ hostname }}
        backrefs: true

Если в исходном файле присутствует строка вида:

host=oldhost

После выполнения задачи она будет изменена на:

host={{ hostname }}