Роли
Роли позволяют автоматически загружать связанные переменные, файлы, задачи, обработчики и другие артефакты Ansible на основе известной структуры файлов. Сгруппировав содержимое в роли, вы сможете легко повторно использовать их и делиться ими с другими пользователями.
- Структура каталогов роли
- Хранение и поиск ролей
- Встраивание модулей и плагинов в роли
- Обмен ролями: Ansible Galaxy
Структура каталогов роли
Роль Ansible имеет заданную структуру каталогов с семью основными стандартными каталогами. В каждую роль необходимо включить хотя бы один из этих каталогов. Можно опустить любые каталоги, которые не используются ролью. Например:
# playbooks site.yml webservers.yml fooservers.yml
roles/
common/ # this hierarchy represents a "role"
tasks/ #
main.yml # <-- tasks file can include smaller files if warranted
handlers/ #
main.yml # <-- handlers file
templates/ # <-- files for use with the template resource
ntp.conf.j2 # <------- templates end in .j2
files/ #
bar.txt # <-- files for use with the copy resource
foo.sh # <-- script files for use with the script resource
vars/ #
main.yml # <-- variables associated with this role
defaults/ #
main.yml # <-- default lower priority variables for this role
meta/ #
main.yml # <-- role dependencies
library/ # roles can also include custom modules
module_utils/ # roles can also include custom module_utils
lookup_plugins/ # or other types of plugins, like lookup in this case
webtier/ # same kind of structure as "common" was above, done for the webtier role
monitoring/ # ""
fooapp/ # ""
По умолчанию Ansible ищет в большинстве каталогов роли файл main.yml с соответствующим содержимым (а также main.yaml и main):
-
tasks/main.yml— список задач, предоставляемых ролью для выполнения в сценарии. -
handlers/main.yml— обработчики, импортируемые в родительский сценарий для использования ролью или другими ролями и задачами сценария. -
defaults/main.yml— переменные роли с очень низким приоритетом (подробнее см. раздел Использование переменных). Значения по умолчанию самой роли имеют приоритет над значениями по умолчанию других ролей, но любые другие источники переменных имеют приоритет над ними. -
vars/main.yml— переменные с высоким приоритетом, предоставляемые ролью сценарию (подробнее см. раздел Использование переменных). -
files/stuff.txt— один или несколько файлов, доступных роли и её дочерним ролям. -
templates/something.j2— шаблоны, используемые в роли или дочерних ролях. -
meta/main.yml— метаданные роли, включая зависимости от других ролей и необязательные метаданные Galaxy, например поддерживаемые платформы. Это необходимо для загрузки роли в Galaxy как отдельной роли, но не для использования роли в сценарии.
Примечание
- Для роли не требуется ни один из перечисленных выше файлов. Например, можно предоставить только
files/something.txtилиvars/for_import.yml— роль всё равно будет считаться допустимой. - В отдельные роли можно также включать пользовательские модули и/или плагины, например
library/my_module.py, которые могут использоваться в этой роли (подробнее см. раздел Встраивание модулей и плагинов в роли). - «Отдельная» роль — это роль, которая не входит в коллекцию и устанавливается как самостоятельное содержимое.
- Переменные из
vars/иdefaults/импортируются в область видимости сценария, если это не отключено параметромpublicвimport_role/include_role.
В некоторые каталоги можно добавлять другие YAML-файлы, но по умолчанию они не используются. Их можно подключать/импортировать напрямую или указывать при использовании include_role/import_role. Например, можно разместить задачи для конкретных платформ в отдельных файлах и ссылаться на них из файла tasks/main.yml:
# roles/example/tasks/main.yml
- name: Install the correct web server for RHEL
ansible.builtin.import_tasks: redhat.yml
when: ansible_facts['os_family']|lower == 'redhat'
- name: Install the correct web server for Debian
ansible.builtin.import_tasks: debian.yml
when: ansible_facts['os_family']|lower == 'debian'
# roles/example/tasks/redhat.yml
- name: Install web server
ansible.builtin.yum:
name: "httpd"
state: present
# roles/example/tasks/debian.yml
- name: Install web server
ansible.builtin.apt:
name: "apache2"
state: present
Или вызывать эти задачи напрямую при загрузке роли, минуя файлы main.yml:
- name: include apt tasks
ansible.builtin.include_role:
name: package_manager_bootstrap
tasks_from: apt.yml
when: ansible_facts['os_family'] == 'Debian'
Каталоги defaults и vars также могут содержать вложенные каталоги. Если ваш файл переменных является каталогом, Ansible читает все файлы переменных и каталоги внутри него в алфавитном порядке. Если во вложенном каталоге есть и файлы переменных, и каталоги, Ansible сначала читает каталоги. Ниже приведён пример каталога vars/main:
roles/
common/ # this hierarchy represents a "role"
vars/
main/ # <-- variables associated with this role
first_nested_directory/
first_variables_file.yml
second_nested_directory/
second_variables_file.yml
third_variables_file.yml
Хранение и поиск ролей
По умолчанию Ansible ищет роли в следующих расположениях:
- в коллекциях, если вы их используете
- в каталоге с именем
roles/, расположенном относительно файла сценария - в настроенном каталоге roles_path. Путь поиска по умолчанию —
~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles. - в каталоге, где находится файл сценария
Если роли хранятся в другом месте, задайте параметр конфигурации roles_path, чтобы Ansible мог найти их. Размещение общих ролей в одном месте упрощает их использование в нескольких сценариях. Подробнее об управлении настройками в ansible.cfg см. в разделе Настройка Ansible.
Кроме того, роль можно вызвать, указав полный путь:
---
- hosts: webservers
roles:
- role: '/path/to/my/roles/common'
Использование ролей
Роли можно использовать следующими способами:
- на уровне сценария с помощью параметра
roles: это классический способ использования ролей в сценарии. - на уровне задач с помощью
include_role: роли можно динамически повторно использовать в любом месте разделаtasksсценария с помощьюinclude_role. - на уровне задач с помощью
import_role: роли можно статически повторно использовать в любом месте разделаtasksсценария с помощьюimport_role. - в качестве зависимости другой роли (см. ключевое слово
dependenciesвmeta/main.ymlна этой же странице).
Использование ролей на уровне сценария
Классический (исходный) способ использования ролей — параметр roles для заданного сценария:
---
- hosts: webservers
roles:
- common
- webservers
При использовании параметра roles на уровне сценария каждая роль «x» ищет файл main.yml (а также main.yaml и main) в следующих каталогах:
roles/x/tasks/roles/x/handlers/roles/x/vars/roles/x/defaults/roles/x/meta/- Любые задачи копирования, запуска скриптов, использования шаблонов или подключения (в роли) могут ссылаться на файлы в roles/x/{files,templates,tasks}/ (каталог зависит от задачи), не указывая относительный или абсолютный путь.
Примечание
vars и defaults также могут соответствовать каталогу с таким же именем; Ansible обработает все файлы в этом каталоге. Подробнее см. раздел Структура каталогов роли.
Примечание
При использовании include_role/import_role можно указать собственное имя файла вместо main. Каталог meta является исключением, поскольку его нельзя настроить.
При использовании параметра roles на уровне сценария Ansible рассматривает роли как статические импорты и обрабатывает их во время разбора сценария. Ansible выполняет каждый сценарий в следующем порядке:
- Все
pre_tasks, определённые в сценарии. - Все обработчики, вызванные задачами pre_tasks.
- Каждая роль, указанная в
roles:, в указанном порядке. Сначала выполняются все зависимости роли, определённые вmeta/main.ymlэтой роли, с учётом фильтрации по тегам и условий. Подробнее см. раздел Использование зависимостей ролей. - Все
tasks, определённые в сценарии. - Все обработчики, вызванные ролями или задачами.
- Все
post_tasks, определённые в сценарии. - Все обработчики, вызванные задачами post_tasks.
Примечание
Если вы используете теги для задач роли, не забудьте также назначить теги задачам pre_tasks и post_tasks и зависимостям роли и передать их, особенно если эти задачи и зависимости используются для управления мониторингом периодов простоя или балансировкой нагрузки. Подробнее о добавлении и использовании тегов см. в разделе Теги.
Параметру roles можно передать и другие ключевые слова:
---
- hosts: webservers
roles:
- common
- role: foo_app_instance
vars:
dir: '/opt/a'
app_port: 5000
tags: typeA
- role: foo_app_instance
vars:
dir: '/opt/b'
app_port: 5001
tags: typeB
Если добавить тег к параметру role, Ansible применит его ко ВСЕМ задачам в роли.
Примечание
До версии ansible-core 2.15 переменные vars: из раздела roles: сценария добавлялись к переменным сценария и становились доступными всем его задачам до и после роли. Это поведение можно изменить с помощью параметра DEFAULT_PRIVATE_ROLE_VARS. В более новых версиях vars: не попадают в область видимости переменных сценария.
Подключение ролей: динамическое повторное использование
Роли можно динамически повторно использовать в любом месте раздела tasks сценария с помощью include_role. Роли, добавленные в раздел roles, выполняются до любых других задач сценария, тогда как подключённые роли выполняются в том порядке, в котором они определены. Если перед задачей include_role есть другие задачи, сначала выполняются они.
Чтобы подключить роль:
---
- hosts: webservers
tasks:
- name: Print a message
ansible.builtin.debug:
msg: "this task runs before the example role"
- name: Include the example role
ansible.builtin.include_role:
name: example
- name: Print a message
ansible.builtin.debug:
msg: "this task runs after the example role"
При подключении ролей можно передавать другие ключевые слова, включая переменные и теги:
---
- hosts: webservers
tasks:
- name: Include the foo_app_instance role
ansible.builtin.include_role:
name: foo_app_instance
vars:
dir: '/opt/a'
app_port: 5000
tags: typeA
# ...
Если добавить тег к задаче include_role, Ansible применит его только к самому подключению. Это значит, что можно передать --tags, чтобы запустить только выбранные задачи роли, если у этих задач есть тот же тег, что и у инструкции подключения. Подробнее см. в разделе Выборочный запуск задач с тегами в повторно используемых файлах.
Роль можно подключить по условию:
---
- hosts: webservers
tasks:
- name: Include the some_role role
ansible.builtin.include_role:
name: some_role
when: "ansible_facts['os_family'] == 'RedHat'"
Импорт ролей: статическое повторное использование
Роли можно статически повторно использовать в любом месте раздела tasks сценария с помощью import_role. Это работает так же, как использование ключевого слова roles. Например:
---
- hosts: webservers
tasks:
- name: Print a message
ansible.builtin.debug:
msg: "before we run our role"
- name: Import the example role
ansible.builtin.import_role:
name: example
- name: Print a message
ansible.builtin.debug:
msg: "after we ran our role"
При импорте ролей можно передавать другие ключевые слова, включая переменные и теги:
---
- hosts: webservers
tasks:
- name: Import the foo_app_instance role
ansible.builtin.import_role:
name: foo_app_instance
vars:
dir: '/opt/a'
app_port: 5000
# ...
Если добавить тег к инструкции import_role, Ansible применит его ко всем задачам в роли. Подробнее см. в разделе Наследование тегов: добавление тегов к нескольким задачам.
Проверка аргументов роли
Начиная с версии 2.11 можно включить проверку аргументов роли на основе спецификации аргументов. Эта спецификация определяется в файле meta/argument_specs.yml (или файле с расширением .yaml). Если такая спецификация аргументов определена, в начало выполнения роли добавляется новая задача, проверяющая переданные роли параметры на соответствие спецификации. Если параметры не проходят проверку, выполнение роли завершается ошибкой.
Примечание
Ansible также поддерживает спецификации ролей, определённые в файле meta/main.yml роли. Однако любая роль, в которой спецификации указаны в этом файле, не будет работать в версиях ниже 2.11. Поэтому для обеспечения обратной совместимости рекомендуется использовать файл meta/argument_specs.yml.
Примечание
Если проверка аргументов используется для роли с определёнными зависимостями, проверка этих зависимостей будет выполнена до запуска зависимой роли, даже если проверка аргументов зависимой роли завершилась неудачей.
Примечание
Ansible помечает добавленную задачу проверки аргументов роли тегом always. Если роль импортирована статически, эта задача выполняется, если не используется флаг --skip-tags.
Формат спецификации
Спецификация аргументов роли должна быть определена в блоке верхнего уровня argument_specs в файле meta/argument_specs.yml роли. Все поля записываются строчными буквами.
- entry-point-name:
-
- Имя точки входа роли.
- Если точка входа не указана, здесь следует использовать
main. - Это будет основная часть имени файла задач, который нужно выполнить, без расширения файла
.ymlили.yaml.
- short_description:
-
- Краткое описание точки входа в одну строку. В идеале это словосочетание, а не предложение.
short_descriptionотображается командойansible-doc -t role -l.- Оно также становится частью заголовка страницы роли в документации.
- Краткое описание всегда должно быть строкой, а не списком, и не должно заканчиваться точкой.
- В этом поле можно использовать разметку Ansible.
- description:
-
- Более подробное описание, которое может содержать несколько строк.
-
- Это может быть одна строка или список строк. Если это список строк, каждый элемент
-
списка становится новым абзацем.
- В этом поле можно использовать разметку Ansible.
- version_added:
-
- Версия роли, в которой была добавлена точка входа.
- Это строка, а не число с плавающей точкой, например
version_added: '2.1'. - Для коллекций здесь должна указываться версия коллекции, в которой была добавлена точка входа. Например,
version_added: 1.0.0.
- author:
-
- Имена авторов точки входа.
- Это может быть одна строка или список строк. Для каждого автора используйте отдельный элемент списка. Если автор только один, укажите строку или список из одного элемента.
- options:
-
- Параметры часто называют «параметрами» или «аргументами». В этом разделе определяются эти параметры.
- Для каждого параметра роли (аргумента) можно указать:
- option-name:
-
- Имя параметра/аргумента.
- description:
-
- Подробное объяснение назначения этого параметра. Оно должно быть написано полными предложениями.
- Это может быть одна строка или список строк. Если это список строк, каждый его элемент становится новым абзацем.
- В этом поле можно использовать разметку Ansible.
- version_added:
-
- Указывается только в том случае, если параметр добавлен после первоначального выпуска роли/точки входа. Иными словами, это значение больше, чем значение поля верхнего уровня
version_added. - Это строка, а не число с плавающей точкой, например
version_added: '2.1'. - Для коллекций здесь должна указываться версия коллекции, в которой был добавлен параметр. Например,
version_added: 1.0.0.
- Указывается только в том случае, если параметр добавлен после первоначального выпуска роли/точки входа. Иными словами, это значение больше, чем значение поля верхнего уровня
- type:
-
- Тип данных параметра. Допустимые значения для
typeсм. в разделе Спецификация аргументов. Значение по умолчанию —str. - Если параметр имеет тип
list, необходимо указатьelements.
- Тип данных параметра. Допустимые значения для
- required:
-
- Требуется только в том случае, если
true. - Если поле отсутствует, параметр не является обязательным.
- Требуется только в том случае, если
- default:
-
- Если
requiredравноfalseили отсутствует, можно указатьdefault(если поле отсутствует, предполагаетсяnull). - Убедитесь, что значение по умолчанию в документации совпадает со значением по умолчанию в коде. Фактическое значение по умолчанию для переменной роли всегда берётся из значений роли по умолчанию (определённых в разделе Структура каталогов роли).
- Поле default не следует указывать в описании, если только для него не требуется дополнительная информация или условия.
- Если параметр имеет логическое значение, для совместимости с
ansible-lintследует использоватьtrue/false.
- Если
- choices:
-
- Список значений параметра.
- Если список пуст, его следует опустить.
- elements:
-
- Задаёт тип данных элементов списка, если тип —
list.
- Задаёт тип данных элементов списка, если тип —
- options:
-
- Если параметр принимает словарь или список словарей, здесь можно определить его структуру.
Пример спецификации
# roles/myapp/meta/argument_specs.yml
---
argument_specs:
# roles/myapp/tasks/main.yml entry point
main:
short_description: Main entry point for the myapp role
description:
- This is the main entrypoint for the C(myapp) role.
- Here we can describe what this entrypoint does in lengthy words.
- Every new list item is a new paragraph. You can have multiple sentences
per paragraph.
author:
- Daniel Ziegenberg
options:
myapp_int:
type: "int"
required: false
default: 42
description:
- "The integer value, defaulting to 42."
- "This is a second paragraph."
myapp_str:
type: "str"
required: true
description: "The string value"
myapp_list:
type: "list"
elements: "str"
required: true
description: "A list of string values."
version_added: 1.3.0
myapp_list_with_dicts:
type: "list"
elements: "dict"
required: false
default:
- myapp_food_kind: "meat"
myapp_food_boiling_required: true
myapp_food_preparation_time: 60
- myapp_food_kind: "fruits"
myapp_food_preparation_time: 5
description: "A list of dicts with a defined structure and with default a value."
options:
myapp_food_kind:
type: "str"
choices:
- "vegetables"
- "fruits"
- "grains"
- "meat"
required: false
description: "A string value with a limited list of allowed choices."
myapp_food_boiling_required:
type: "bool"
required: false
default: false
description: "Whether the kind of food requires boiling before consumption."
myapp_food_preparation_time:
type: int
required: true
description: "Time to prepare a dish in minutes."
myapp_dict_with_suboptions:
type: "dict"
required: false
default:
myapp_host: "bar.foo"
myapp_exclude_host: true
myapp_path: "/etc/myapp"
description: "A dict with a defined structure and default values."
options:
myapp_host:
type: "str"
choices:
- "foo.bar"
- "bar.foo"
- "ansible.foo.bar"
required: true
description: "A string value with a limited list of allowed choices."
myapp_exclude_host:
type: "bool"
required: true
description: "A boolean value."
myapp_path:
type: "path"
required: true
description: "A path value."
original_name:
type: list
elements: "str"
required: false
description: "An optional list of string values."
# roles/myapp/tasks/alternate.yml entry point
alternate:
short_description: Alternate entry point for the myapp role
description:
- This is the alternate entrypoint for the C(myapp) role.
version_added: 1.2.0
options:
myapp_int:
type: "int"
required: false
default: 1024
description: "The integer value, defaulting to 1024."
Многократный запуск роли в одном сценарии
Ansible выполняет каждую роль в сценарии только один раз, даже если она определена несколько раз, — за исключением случаев, когда параметры роли различаются в каждом определении. Например, в следующем сценарии Ansible запустит роль foo только один раз:
---
- hosts: webservers
roles:
- foo
- bar
- foo
Есть два способа заставить Ansible запускать роль несколько раз.
Передача разных параметров
Если в каждом определении роли передать разные параметры, Ansible запустит роль несколько раз. Передача разных значений переменных не равнозначна передаче разных параметров роли. Для такого поведения необходимо использовать ключевое слово roles, поскольку import_role и include_role не принимают параметры роли.
В этом сценарии роль foo запускается дважды:
---
- hosts: webservers
roles:
- { role: foo, message: "first" }
- { role: foo, message: "second" }
Этот синтаксис также запускает роль foo дважды:
---
- hosts: webservers
roles:
- role: foo
message: "first"
- role: foo
message: "second"
В этих примерах Ansible запускает foo дважды, поскольку в каждом определении роли указаны разные параметры.
Использование allow_duplicates: true
Добавьте allow_duplicates: true в файл meta/main.yml роли:
# playbook.yml
---
- hosts: webservers
roles:
- foo
- foo
# roles/foo/meta/main.yml
---
allow_duplicates: true
В этом примере Ansible запускает foo дважды, поскольку мы явно разрешили это.
Использование зависимостей ролей
Зависимости ролей позволяют автоматически подключать другие роли при использовании роли.
Зависимости ролей — это предварительные условия, а не настоящие зависимости. Между ролями нет отношения «родитель—дочерняя роль». Ansible загружает все перечисленные роли, сначала выполняет роли, указанные в dependencies, а затем выполняет роль, в которой они перечислены. Родительским объектом всех ролей, включая роли, вызванные списком dependencies, является объект сценария.
Зависимости ролей хранятся в файле meta/main.yml в каталоге роли. Этот файл должен содержать список ролей и параметров, которые нужно вставить перед указанной ролью. Например:
# roles/myapp/meta/main.yml
---
dependencies:
- role: common
vars:
some_parameter: 3
- role: apache
vars:
apache_port: 80
- role: postgres
vars:
dbname: blarg
other_parameter: 12
Ansible всегда выполняет роли, указанные в dependencies, до роли, в которой они перечислены. При использовании ключевого слова roles Ansible рекурсивно выполняет эту последовательность. Например, если указать роль foo в roles:, роль foo укажет роль bar в dependencies в своём файле meta/main.yml, а роль bar укажет роль baz в dependencies в своём файле meta/main.yml, Ansible выполнит сначала baz, затем bar и после этого foo.
Многократный запуск зависимостей ролей в одном сценарии
Ansible обрабатывает повторяющиеся зависимости ролей так же, как повторяющиеся роли, перечисленные в roles:: зависимость роли выполняется только один раз, даже если она определена несколько раз, за исключением случаев, когда параметры, теги или условие when, заданные для роли, различаются в каждом определении. Если две роли в сценарии указывают одну и ту же третью роль в качестве зависимости, Ansible выполняет эту зависимость только один раз, если не переданы разные параметры, теги или условие when и не используется allow_duplicates: true в роли, которую требуется запускать несколько раз. Подробнее см. в разделе Зависимости ролей Galaxy.
Примечание
При устранении дублирования ролей не учитывается сигнатура вызова родительских ролей. Кроме того, использование vars: вместо параметров роли приводит к побочному эффекту изменения области видимости переменных. При использовании vars: эти переменные получают область видимости уровня сценария. В приведённом ниже примере использование vars: приведёт к тому, что n будет определена как 4 во всём сценарии, включая роли, вызванные до неё.
Кроме того, следует учитывать, что удаление дубликатов ролей происходит до вычисления переменных. Это означает, что ленивое вычисление может привести к тому, что кажущиеся разными вызовы ролей будут считаться одинаковыми, из-за чего роль не запустится повторно.
Например, роль с именем car зависит от роли с именем wheel следующим образом:
---
dependencies:
- role: wheel
n: 1
- role: wheel
n: 2
- role: wheel
n: 3
- role: wheel
n: 4
А роль wheel зависит от двух ролей: tire и brake. Тогда файл meta/main.yml для wheel будет содержать следующее:
--- dependencies: - role: tire - role: brake
А файлы meta/main.yml для tire и brake будут содержать следующее:
--- allow_duplicates: true
Итоговый порядок выполнения будет таким:
tire(n=1) brake(n=1) wheel(n=1) tire(n=2) brake(n=2) wheel(n=2) ... car
Чтобы использовать allow_duplicates: true с зависимостями ролей, необходимо указать его для роли, перечисленной в dependencies, а не для роли, которая её перечисляет. В приведённом выше примере allow_duplicates: true указано в meta/main.yml ролей tire и brake. Для роли wheel параметр allow_duplicates: true не требуется, поскольку для каждого экземпляра, определённого в car, используются разные значения параметров.
Примечание
Подробнее о том, как Ansible выбирает значения переменных, определённые в разных местах (наследование и область видимости переменных), см. в разделе Использование переменных. Кроме того, удаление дубликатов происходит ТОЛЬКО на уровне сценария, поэтому в нескольких сценариях одного файла сценария роли могут запускаться повторно.
Встраивание модулей и плагинов в роли
Примечание
Это относится только к отдельным ролям. Роли в коллекциях не поддерживают встраивание плагинов; для распространения плагинов они должны использовать структуру plugins коллекции.
Если вы пишете пользовательский модуль (см. раздел Стоит ли разрабатывать модуль?) или плагин (см. раздел Разработка плагинов), возможно, вы захотите распространять его как часть роли. Например, если вы написали модуль, помогающий настраивать внутреннее программное обеспечение вашей компании, и хотите, чтобы другие сотрудники организации могли его использовать, но не хотите объяснять всем, как настраивать путь к библиотеке Ansible, можно включить этот модуль в роль internal_config.
Чтобы добавить модуль или плагин в роль, создайте рядом с каталогами ‘tasks’ и ‘handlers’ каталог с именем ‘library’ и поместите модуль непосредственно в каталог ‘library’.
Предположим, у вас есть следующее:
roles/
my_custom_modules/
library/
module1
module2
Модуль будет доступен как в самой роли, так и в любых ролях, вызываемых после неё, например:
---
- hosts: webservers
roles:
- my_custom_modules
- some_other_role_using_my_custom_modules
- yet_another_role_using_my_custom_modules
При необходимости можно также встроить в роль модуль, чтобы изменить модуль из основной поставки Ansible. Например, можно использовать разрабатываемую версию определённого модуля до её включения в производственные выпуски, скопировав модуль и встроив копию в роль. Используйте этот подход с осторожностью: сигнатуры API основных компонентов могут измениться, поэтому работоспособность такого обходного решения не гарантируется.
Тот же механизм можно использовать для встраивания и распространения плагинов в роли, применяя ту же схему. Например, для плагина фильтра:
roles/
my_custom_filter/
filter_plugins
filter1
filter2
Затем эти фильтры можно использовать в шаблоне Jinja в любой роли, вызываемой после ‘my_custom_filter’.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_reuse_roles.html