Spec-Zone.ru › Ansible

Роли

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

  • Структура каталогов роли
  • Хранение и поиск ролей
  • Использование ролей

    • Использование ролей на уровне сценария
    • Подключение ролей: динамическое повторное использование
    • Импорт ролей: статическое повторное использование
  • Проверка аргументов роли

    • Формат спецификации
    • Пример спецификации
  • Многократный запуск роли в одном сценарии

    • Передача разных параметров
    • Использование allow_duplicates: true
  • Использование зависимостей ролей

    • Многократный запуск зависимостей ролей в одном сценарии
  • Встраивание модулей и плагинов в роли
  • Обмен ролями: 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’.

Обмен ролями: Ansible Galaxy

Ansible Galaxy — это бесплатный сайт для поиска, скачивания, оценки и обзора всевозможных ролей Ansible, разработанных сообществом. Он может стать отличным способом быстро приступить к работе над проектами автоматизации.

Клиент ansible-galaxy входит в состав Ansible. Клиент Galaxy позволяет скачивать роли из Ansible Galaxy и предоставляет отличную базовую структуру для создания собственных ролей.

Дополнительную информацию см. на странице документации Ansible Galaxy.

См. также

Руководство пользователя Galaxy

Создание новых ролей, публикация ролей в Galaxy и управление ролями

Синтаксис YAML

Изучите синтаксис YAML

Работа с плейбуками

Обзор основных возможностей языка плейбуков

Общие рекомендации

Советы и рекомендации по работе с плейбуками

Использование переменных

Переменные в плейбуках

Условные выражения

Условные выражения в плейбуках

Циклы

Циклы в плейбуках

Теги

Использование тегов для выбора ролей и задач или их пропуска в длинных плейбуках

Индекс коллекций

Просмотр существующих коллекций, модулей и плагинов

Стоит ли разрабатывать модуль?

Расширение Ansible с помощью собственных модулей

Общение

Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по общению в сообществе Ansible

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API