Spec-Zone.ru › Ansible 2.11

Использование артефактов Ansible

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

  • Создание повторно используемых файлов и ролей
  • Повторное использование плейбуков
  • Повторное использование файлов и ролей

    • Включения: динамическое повторное использование
    • Импорты: статическое повторное использование
    • Сравнение включений и импортов: динамическое и статическое повторное использование
  • Повторное использование задач в качестве обработчиков

    • Запуск включенных (динамических) обработчиков
    • Запуск импортированных (статических) обработчиков

Создание повторно используемых файлов и ролей

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

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

Введено в версии 2.4.

Повторное использование плейбуков

Вы можете включить несколько плейбуков в основной плейбук. Однако вы можете использовать только импорты для повторного использования плейбуков. Например:

- import_playbook: webservers.yml
- import_playbook: databases.yml

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

Повторное использование файлов и ролей

Ansible предлагает два способа повторного использования файлов и ролей в плейбуке: динамический и статический.

  • Для динамического повторного использования добавьте include_* задачу в раздел задач плейя:

    • include_role
    • include_tasks
    • include_vars
  • Для статического повторного использования добавьте import_* задачу в раздел задач плейя:

    • import_role
    • import_tasks

Утверждения include и import задач могут использоваться на произвольной глубине.

Вы по-прежнему можете использовать ключевое слово roles на уровне плейя, чтобы статически включить роль в плейбук. Однако ключевое слово include (ранее использовавшееся как для файлов задач, так и для включений на уровне плейбука), теперь устарело.

Включения: динамическое повторное использование

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

Основным преимуществом использования include_* утверждений является циклическое использование. Когда цикл используется с включением, включенные задачи или роль будут выполняться один раз для каждого элемента в цикле.

Вы можете передавать переменные в включения. Дополнительную информацию о наследовании и приоритете переменных см. в разделе Приоритет переменных: Где следует поместить переменную?.

Импорты: статическое повторное использование

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

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

tasks:
- import_tasks: wordpress.yml
  vars:
    wp_user: timmy

- import_tasks: wordpress.yml
  vars:
    wp_user: alice

- import_tasks: wordpress.yml
  vars:
    wp_user: bob

Дополнительно о наследовании и приоритете переменных см. в разделе Приоритет переменных: Где следует поместить переменную?.

Сравнение включений и импортов: динамическое и статическое повторное использование

Каждый подход к повторному использованию распределенных артефактов Ansible имеет свои преимущества и ограничения. Вы можете выбрать динамическое повторное использование для некоторых плейбуков и статическое повторное использование для других. Хотя вы можете использовать как динамическое, так и статическое повторное использование в одном плейбуке, лучше выбрать один подход для каждого плейбука. Смешивание статического и динамического повторного использования может привести к трудно диагностируемым ошибкам в ваших плейбуках. В этой таблице обобщены основные различия, чтобы вы могли выбрать лучший подход для каждого создаваемого вами плейбука.

Include_*

Import_*

Тип повторного использования

Динамический

Статический

Когда обрабатывается

Во время выполнения, когда встречено

Обрабатывается до выполнения плейбука

Задача или плей

Все включения — это задачи

import_playbook не может быть задачей

Параметры задачи

Применяется только к самой задаче включения

Применяется ко всем дочерним задачам в импорте

Вызов из циклов

Выполняется один раз для каждого элемента цикла

Не может использоваться в цикле

Использование тегов

Теги внутри включений не указаны

Все теги появляются с --list-tags

Использование задач

Задачи внутри включений не указаны

Все задачи появляются с --list-tasks

Уведомление обработчиков

Невозможно запустить обработчики внутри включений

Можно запустить отдельные импортированные обработчики

Начало с задач

Невозможно начать с задач внутри включений

Можно начать с импортированных задач

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

Можно include_*: {{ inventory_var }}

Нельзя import_*: {{ inventory_var }}

С плейбуками

Нет include_playbook

Можно импортировать полные плейбуки

С файлами переменных

Можно включать файлы переменных

Используйте vars_files: для импорта переменных

Примечание

  • Также существуют большие различия в потреблении ресурсов и производительности. Импорты довольно простые и быстрые, а включения требуют много управления и учета.

Повторное использование задач в качестве обработчиков

Вы также можете использовать включения и импорты в разделе Обработчики: выполнение операций при изменениях плейбука. Например, если вы хотите определить, как перезапустить Apache, вам нужно сделать это только один раз для всех ваших плейбуков. Вы можете создать restarts.yml файл, который выглядит так:

# restarts.yml
- name: Restart apache
  ansible.builtin.service:
    name: apache
    state: restarted

- name: Restart mysql
  ansible.builtin.service:
    name: mysql
    state: restarted

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

Запуск включенных (динамических) обработчиков

Включения выполняются во время выполнения, поэтому имя включения существует во время выполнения плейя, но включенные задачи не существуют, пока само включение не будет выполнено. Чтобы использовать Restart apache задачу с динамическим повторным использованием, обратитесь к имени самого включения. Этот подход запускает все задачи во включенном файле в качестве обработчиков. Например, с файлом задач, показанным выше:

- name: Trigger an included (dynamic) handler
  hosts: localhost
  handlers:
    - name: Restart services
      include_tasks: restarts.yml
  tasks:
    - command: "true"
      notify: Restart services

Запуск импортированных (статических) обработчиков

Импорты обрабатываются до начала плейя, поэтому имя импорта больше не существует во время выполнения плейя, но имена отдельных импортированных задач существуют. Чтобы использовать Restart apache задачу со статическим повторным использованием, обратитесь к имени каждой задачи или задач в импортированном файле. Например, с файлом задач, показанным выше:

- name: Trigger an imported (static) handler
  hosts: localhost
  handlers:
    - name: Restart services
      import_tasks: restarts.yml
  tasks:
    - command: "true"
      notify: Restart apache
    - command: "true"
      notify: Restart mysql

См. также

Модули утилит

Документация по модулям include* и import* обсуждаемым здесь.

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

Обзор основных функций языка плейбуков

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

Все о переменных в плейбуках

Условные операторы

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

Циклы

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

Советы и хитрости

Советы и хитрости для плейбуков

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

Как делиться ролями в Galaxy, управление ролями

Примеры Ansible на GitHub

Полные файлы плейбуков из исходного кода проекта GitHub

Список рассылки

Вопросы? Помощь? Идеи? Заходите на список рассылки на Google Groups

© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/user_guide/playbooks_reuse.html

Spec-Zone.ru

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