blockinfile#
Модуль ansible.builtin.blockinfile используется для вставки, обновления или удаления многострочного текстового блока в файле.
Этот блок заключен между маркерными строками, что позволяет легко найти и повторно использовать его.
Дополнительно модуль может изменить атрибуты и режим доступа к файлу, а также создать его резервную копию перед заменой.
Особенности работы#
Особенности использования модуля ansible.builtin.blockinfile:
при использовании циклов (loop) обязательно задавайте уникальные маркеры для каждого элемента, иначе блоки будут перезаписываться;
при использовании модуля несколько раз для вставки различных блоков в один файл задайте уникальные маркеры для каждого блока с помощью параметра
marker.
Параметры#
Модуль принимает следующие параметры:
- attributes, attr#
Изменение атрибутов файла, в который вставляется блок. Чтобы узнать о поддерживаемых атрибутах, обратитесь к руководству
chattrв целевой системе:man chattrЭтот параметр представляет собой строку, содержащую атрибуты в порядке, принятом в выводе команды
lsattrна целевой системе. Строка также может включать один из следующих операторов:=– установить строго указанный набор атрибутов;+– добавить указанные атрибуты к существующим;-– удалить указанные атрибуты из существующих.
Если оператор не указан, используется оператор
=. Это значит, что будут сброшены все установленные ранее атрибуты, кроме явно указанных в строке.
- backup#
Создание резервной копии файла, указанного в
path, включая метку времени.Возможные значения:
false– не создавать резервную копию;true– создать резервную копию и только потом заменить существующий файл на отредактированный модулем.
Значение по умолчанию:
false.
- block, content#
Текст, который будет вставлен между маркерными строками.
Если значение не задано или указана пустая строка, то блок будет удален. Эквивалентно
state=absent.Значение по умолчанию:
""(пустая строка).
- create#
Создание файла, если он не существует.
Возможные значения:
false– не создавать файл. Если файл отсутствует, работа модуля завершится без ошибок и изменений.true– создать файл.
Значение по умолчанию:
false.
- group#
Название группы, которой будет принадлежать файл. Параметр работает как утилита
chown.Если значение не задано, используется основная (primary) группа пользователя, от имени которого выполняется задача. При выполнении задачи с привилегиями
rootпредыдущая группа-владелец может быть сохранена.
- insertafter#
Регулярное выражение, определяющее куда будет вставлен блок, если в файле нет маркеров. Блок вставится после последнего совпадения с регулярным выражением.
Если совпадений не найдено, используется специальное значение
EOF. При значенииEOFблок вставляется в конец файла.Наличие флага многострочности (
?m) в регулярном выражении определяет, будет ли поиск выполняться построчно или с использованием нескольких строк.
- insertbefore#
Регулярное выражение, определяющее куда будет вставлен блок, если в файле нет маркеров. Блок вставится перед последним совпадением с регулярным выражением.
Если совпадений не найдено, блок будет вставлен в конец файла.
При значении
BOFблок вставляется в начало файла.Наличие флага многострочности (
?m) в регулярном выражении определяет, будет ли поиск выполняться построчно или с использованием нескольких строк.
- marker#
Шаблон строки, которая используется для создания маркерных строк, окружающих вставляемый блок в файле.
Содержит переменную
mark, которая будет заменена на значение из параметраmarker_beginилиmarker_end.Использование собственного маркера без переменной
markможет привести к тому, что модуль будет вставлять блок повторно при последующих запусках сценария, потому что он не найдет существующий маркер.Параметр не поддерживает многострочные маркеры. Если использовать маркер из нескольких строк, это приведет к повторному добавлению блока при каждом запуске, как и при отсутствии переменной
mark.Примечание
Модуль автоматически добавляет символ новой строки после маркера.
Значение по умолчанию:
# {mark} ANSIBLE MANAGED BLOCK.
- marker_begin#
Текст, вставляемый вместо переменной
markв начало открывающей маркерной строки.Значение по умолчанию:
BEGIN.
- marker_end#
Текст, вставляемый вместо переменной
markв начало закрывающей маркерной строки.Значение по умолчанию:
END.
- 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#
Обязательный параметр.
Полный путь к изменяемому файлу.
- 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, которые может использовать модуль.
Атрибут |
Описание |
|---|---|
|
Модуль работает в режиме проверки ( |
|
Модуль поддерживает режим сравнения ( |
|
Модуль поддерживает только POSIX-совместимые ОС. |
|
Модуль использует строгие механизмы работы с файлами Ansible для обеспечения правильных разрешений и предотвращения повреждения данных. |
|
Модуль не поддерживает автоматическую расшифровку исходных файлов с использованием хранилища секретов. |
Примеры#
Для изучения возможностей модуля ознакомьтесь с приведенными ниже примерами.
Вставка блока в sshd_config#
Следующий пример показывает добавление блока в файл /etc/ssh/sshd_config:
---
# ...
tasks:
- name: Inserting a block into a file sshd_config
ansible.builtin.blockinfile:
path: /etc/ssh/sshd_config
block: |
Match User ansible-agent
PasswordAuthentication no
В результате выполнения задачи в файл /etc/ssh/sshd_config будет добавлен следующий блок:
Вставка блока HTML#
Следующий пример показывает добавление блока HTML в файл /var/www/html/index.html после регулярного выражения <body>:
---
# ...
tasks:
- name: Inserting a HTML block
ansible.builtin.blockinfile:
path: /var/www/html/index.html
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
insertafter: "<body>"
block: |
<h1>Welcome to {{ ansible_hostname }}</h1>
<p>Last updated on {{ ansible_date_time.iso8601 }}</p>
В результате выполнения задачи в файл /var/www/html/index.html будет добавлен следующий блок:
Удаление блока#
Следующий пример показывает удаление блока из файла /var/www/html/index.html:
---
# ...
tasks:
- name: Deleting a block
ansible.builtin.blockinfile:
path: /var/www/html/index.html
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
block: ""
Вставка нескольких блоков#
Следующий пример показывает добавление нескольких блоков в файл /etc/hosts:
---
# ...
tasks:
- name: Inserting multiple blocks
ansible.builtin.blockinfile:
path: /etc/hosts
block: "{{ item.ip }} {{ item.name }}"
marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.name }}"
loop:
- { name: host1, ip: 10.10.1.10 }
- { name: host2, ip: 10.10.1.11 }
В результате выполнения задачи в файл /etc/hosts будут добавлены следующие блоки: