Использование фрагментов Ansible
Вы можете записать простой playbook в одном очень большом файле, и большинство пользователей сначала осваивают именно этот однофайловый подход. Однако разделение задач на разные файлы — отличный способ организовать сложные наборы задач и повторно использовать их. Более мелкие и распределённые фрагменты позволяют повторно использовать одни и те же переменные, задачи и плейлисты в нескольких playbooks для решения различных задач. Вы можете использовать распределённые фрагменты в нескольких родительских playbooks или даже несколько раз в одном playbook. Например, вы можете захотеть обновить базу данных клиентов в рамках нескольких разных playbooks. Если вы поместите все задачи, связанные с обновлением базы данных, в файл задач, вы сможете повторно использовать их во многих playbooks, поддерживая их в одном месте.
Создание повторно используемых файлов и ролей
Ansible предлагает четыре распределённых, повторно используемых фрагмента: файлы переменных, файлы задач, playbooks и роли.
- Файл переменных содержит только переменные.
- Файл задач содержит только задачи.
- Playbook содержит как минимум один плейлист и может содержать переменные, задачи и другое содержимое. Вы можете повторно использовать узкоспециализированные playbooks, но вы можете использовать их только статически, а не динамически.
- Роль содержит набор связанных задач, переменных, значений по умолчанию, обработчиков и даже модулей или других плагинов в определённой файловой структуре. В отличие от файлов переменных, файлов задач или playbooks, роли можно легко загружать и обмениваться через Ansible Galaxy. См. Роли для получения подробной информации о создании и использовании ролей.
Введено в версии 2.4.
Повторное использование playbooks
Вы можете включить несколько playbooks в мастер-playbook. Однако вы можете использовать только импорты для повторного использования playbooks. Например:
- import_playbook: webservers.yml - import_playbook: databases.yml
Импорт статически включает playbooks в другие playbooks. Ansible выполняет плейлисты и задачи в каждом импортированном playbook в порядке их перечисления, точно так же, как если бы они были определены непосредственно в мастер-playbook.
Повторное использование файлов и ролей
Ansible предлагает два способа повторного использования файлов и ролей в playbook: динамический и статический.
-
Для динамического повторного использования добавьте
include_*задачу в раздел задач плейлиста: -
Для статического повторного использования добавьте
import_*задачу в раздел задач плейлиста:
Утверждения о включении и импорте задач могут использоваться на произвольной глубине.
Вы по-прежнему можете использовать ключевое слово roles на уровне плейлиста для статического включения роли в playbook. Однако ключевое слово include, ранее использовавшееся как для файлов задач, так и для включений на уровне playbook, теперь устарело.
Include: динамическое повторное использование
Включение ролей, задач или переменных добавляет их в playbook динамически. Ansible обрабатывает включённые файлы и роли по мере их появления в playbook, поэтому на включённые задачи могут влиять результаты предыдущих задач внутри основного playbook. Включённые роли и задачи похожи на обработчики — они могут или не могут быть выполнены, в зависимости от результатов других задач в основном playbook.
Основным преимуществом использования include_* заявлений является циклическое повторение. При использовании цикла с include, включённые задачи или роль будут выполняться один раз для каждого элемента в цикле.
Вы можете передавать переменные в include. См. Приоритет переменных: куда следует поместить переменную? для получения дополнительной информации о наследовании и приоритете переменных.
Import: статическое повторное использование
Импорт ролей, задач или playbooks добавляет их в playbook статически. Ansible предварительно обрабатывает импортированные файлы и роли перед запуском любых задач в playbook, поэтому содержимое импортированного файла никогда не зависит от других задач внутри основного playbook.
Вы можете передавать переменные в импорты. Вам необходимо передавать переменные, если вы хотите запустить импортированный файл более одного раза в playbook. Например:
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
См. Приоритет переменных: куда следует поместить переменную? для получения дополнительной информации о наследовании и приоритете переменных.
Сравнение include и import: динамическое и статическое повторное использование
Каждый подход к повторному использованию распределённых фрагментов Ansible имеет свои преимущества и ограничения. Вы можете выбрать динамическое повторное использование для некоторых playbooks и статическое повторное использование для других. Хотя вы можете использовать как динамическое, так и статическое повторное использование в одном playbook, лучше всего выбрать один подход на playbook. Смешивание статического и динамического повторного использования может привести к трудно диагностируемым ошибкам в ваших playbooks. В этой таблице обобщаются основные различия, чтобы вы могли выбрать лучший подход для каждого создаваемого вами playbook.
Include_* | Import_* | |
|---|---|---|
Тип повторного использования | Динамический | Статический |
Когда обрабатывается | Во время выполнения, при обнаружении | Предварительно обрабатывается во время парсинга playbook |
Задача или плейлист | Все include — это задачи |
|
Параметры задачи | Применимы только к самой задаче include | Применимы ко всем дочерним задачам в импорте |
Вызов из циклов | Выполняется один раз для каждого элемента цикла | Не может использоваться в цикле |
Использование тегов | Теги внутри include не перечислены | Все теги отображаются с |
Использование задач | Задачи внутри include не перечислены | Все задачи отображаются с |
Уведомление обработчиков | Невозможно активировать обработчики внутри include | Можно активировать отдельные импортированные обработчики |
Использование | Нельзя начинать с задач внутри include | Можно начинать с импортированных задач |
Использование переменных инвентаризации | Можно | Нельзя |
С playbooks | Нет | Можно импортировать целые playbooks |
С файлами переменных | Можно включать файлы переменных | Используйте |
Повторное использование задач в качестве обработчиков
Вы также можете использовать include и import в разделе Обработчики: выполнение операций при изменении playbook. Например, если вы хотите определить, как перезапустить Apache, вам нужно сделать это только один раз для всех playbooks. Вы можете создать restarts.yml файл, который выглядит так:
# restarts.yml
- name: Restart apache
ansible.builtin.service:
name: apache
state: restarted
- name: Restart mysql
ansible.builtin.service:
name: mysql
state: restarted
Вы можете активировать обработчики как из импорта, так и из include, но процедура отличается для каждого метода повторного использования. Если вы включаете файл, вы должны уведомить сам include, что запускает все задачи в restarts.yml. Если вы импортируете файл, вы должны уведомить отдельные задачи внутри restarts.yml. Вы можете комбинировать прямые задачи и обработчики с включёнными или импортированными задачами и обработчиками.
Триггер для включённых (динамических) обработчиков
Include выполняется во время выполнения, поэтому имя include существует во время выполнения плейлиста, но включённые задачи не существуют до тех пор, пока сам include не будет активирован. Чтобы использовать Restart apache задачу с динамическим повторным использованием, обратитесь к имени самого include. Этот подход запускает все задачи в включаемом файле в качестве обработчиков. Например, с файлом задач, показанным выше:
- trigger an included (dynamic) handler
hosts: localhost
handlers:
- name: Restart services
include_tasks: restarts.yml
tasks:
- command: "true"
notify: Restart services
Триггер для импортированных (статических) обработчиков
Import обрабатывается до начала плейлиста, поэтому имя импорта больше не существует во время выполнения плейлиста, но имена отдельных импортированных задач существуют. Чтобы использовать Restart apache задачу со статическим повторным использованием, обратитесь к имени каждой задачи или задач внутри импортированного файла. Например, с файлом задач, показанным выше:
- 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–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/user_guide/playbooks_reuse.html