Повторное использование артефактов Ansible
Вы можете написать простой плейбук в одном очень большом файле, и большинство пользователей сначала знакомятся именно с таким подходом. Однако разделение работы по автоматизации на небольшие файлы — отличный способ организовать сложные наборы задач и повторно использовать их. Более мелкие распределённые артефакты позволяют повторно использовать одни и те же переменные, задачи и плейбуки в нескольких плейбуках для различных сценариев. Вы можете использовать распределённые артефакты в нескольких родительских плейбуках или даже несколько раз в одном плейбуке. Например, вам может понадобиться обновить базу данных клиентов в рамках нескольких разных плейбуков. Если поместить все задачи, связанные с обновлением базы данных, в файл задач или роль, их можно будет использовать во многих плейбуках, поддерживая только одну копию.
- Создание повторно используемых файлов и ролей
- Повторное использование плейбуков
- Когда следует преобразовать плейбук в роль
Создание повторно используемых файлов и ролей
Ansible предлагает четыре распределённых повторно используемых артефакта: файлы переменных, файлы задач, плейбуки и роли.
- Файл переменных содержит только переменные.
- Файл задач содержит только задачи.
- Плейбук содержит как минимум один плей и может содержать переменные, задачи и другие элементы. Можно повторно использовать узкоспециализированные плейбуки, но только статически, а не динамически.
- Роль содержит набор связанных задач, переменных, значений по умолчанию, обработчиков и даже модулей или других плагинов в заданной структуре файлов. В отличие от файлов переменных, файлов задач и плейбуков, роли можно легко загружать и распространять через Ansible Galaxy. Подробные сведения о создании ролей и работе с ними см. в разделе Роли.
Добавлено в версии 2.4.
Повторное использование плейбуков
Вы можете включить несколько плейбуков в главный плейбук. Однако для повторного использования плейбуков можно применять только импорт. Например:
- import_playbook: webservers.yml - import_playbook: databases.yml
Импорт статически включает плейбуки в другие плейбуки. Ansible выполняет плейы и задачи каждого импортированного плейбука в указанном порядке, как если бы они были определены непосредственно в главном плейбуке.
Во время выполнения можно выбрать импортируемый плейбук, указав имя файла импортируемого плейбука с помощью переменной, а затем передав переменную с помощью --extra-vars или ключевого слова vars. Например:
- import_playbook: "/path/to/{{ import_from_extra_var }}"
- import_playbook: "{{ import_from_vars }}"
vars:
import_from_vars: /path/to/one_playbook.yml
Если запустить этот плейбук с помощью ansible-playbook my_playbook -e import_from_extra_var=other_playbook.yml, Ansible импортирует и one_playbook.yml, и other_playbook.yml.
Когда следует преобразовать плейбук в роль
Для некоторых сценариев хорошо подходят простые плейбуки. Однако после достижения определённого уровня сложности роли становятся предпочтительнее плейбуков. Роль позволяет хранить значения по умолчанию, обработчики, переменные и задачи в отдельных каталогах, а не в одном длинном документе. Роли легко публиковать в Ansible Galaxy. В сложных сценариях большинство пользователей считают, что роли проще читать, понимать и поддерживать, чем плейбуки, объединяющие всё в одном файле.
Повторное использование файлов и ролей
Ansible предлагает два способа повторного использования файлов и ролей в плейбуке: динамический и статический.
-
Для динамического повторного использования добавьте задачу
include_*в раздел задач плейа: -
Для статического повторного использования добавьте задачу
import_*в раздел задач плейа:
Инструкции включения и импорта задач можно использовать на произвольной глубине вложенности.
Для статического включения роли в плейбук на уровне плейа по-прежнему можно использовать ключевое слово roles без дополнительной конструкции. Однако ключевое слово include, которое раньше использовалось и для файлов задач, и для включений на уровне плейбука, теперь устарело.
Включения: динамическое повторное использование
Включение ролей, задач или переменных динамически добавляет их в плейбук. Ansible обрабатывает включённые файлы и роли по мере их появления в плейбуке, поэтому на включённые задачи могут влиять результаты предыдущих задач в плейбуке верхнего уровня. Включённые роли и задачи похожи на обработчики: они могут выполняться или не выполняться в зависимости от результатов других задач в плейбуке верхнего уровня.
Главное преимущество использования инструкций include_* — возможность циклического выполнения. Если вместе с включением используется цикл, включённые задачи или роли выполняются для каждого элемента цикла.
Имена файлов включаемых ролей, задач и переменных обрабатываются как шаблоны перед включением.
Включениям можно передавать переменные. Подробнее о наследовании и приоритете переменных см. в разделе Приоритет переменных: где следует задавать переменную?.
Импорт: статическое повторное использование
Импорт ролей, задач или плейбуков статически добавляет их в плейбук. Ansible предварительно обрабатывает импортированные файлы и роли до выполнения каких-либо задач в плейбуке, поэтому на импортированное содержимое никогда не влияют другие задачи плейбука верхнего уровня.
Имена файлов импортируемых ролей и задач поддерживают шаблоны, но переменные должны быть доступны во время предварительной обработки импорта в Ansible. Этого можно добиться с помощью ключевого слова vars или используя --extra-vars.
Импорту можно передавать переменные. Передача переменных обязательна, если вы хотите запустить импортированный файл в плейбуке несколько раз. Например:
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_* | |
|---|---|---|
Тип повторного использования | Динамический | Статический |
Когда обрабатывается | Во время выполнения, при достижении инструкции | Предварительно, во время разбора плейбука |
Задача или плей | Все включения являются задачами |
|
Параметры задачи | Применяются только к самой задаче включения | Применяются ко всем дочерним задачам в импорте |
Вызов из циклов | Выполняется для каждого элемента цикла | Нельзя использовать в цикле |
Использование | Теги внутри включений не отображаются в списке | Все теги отображаются с |
Использование | Задачи внутри включений не отображаются в списке | Все задачи отображаются с |
Уведомление обработчиков | Нельзя запускать обработчики внутри включений | Можно запускать отдельные импортированные обработчики |
Использование | Нельзя начинать выполнение с задач внутри включений | Можно начинать выполнение с импортированных задач |
Использование переменных инвентаря | Можно | Нельзя |
С плейбуками | Нет | Можно импортировать целые плейбуки |
С файлами переменных | Можно включать файлы переменных | Используйте |
Примечание
- Существуют также значительные различия в потреблении ресурсов и производительности: импорт довольно лёгкий и быстрый, тогда как включения требуют значительных затрат на управление и учёт.
Повторное использование задач в качестве обработчиков
В разделе Обработчики: выполнение операций при изменении плейбука также можно использовать включения и импорт. Например, если нужно определить способ перезапуска 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
© 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.html