Использование повторно артефактов Ansible
Вы можете написать простой playbook в одном очень большом файле, и большинство пользователей сначала изучают подход с одним файлом. Однако разделение работы по автоматизации на более мелкие файлы — отличный способ организовать сложные наборы задач и повторно использовать их. Более мелкие и распределенные артефакты позволяют повторно использовать те же переменные, задачи и плейы во множестве playbooks для решения различных задач. Вы можете использовать распределенные артефакты в нескольких родительских playbooks или даже несколько раз в одном playbook. Например, вам может потребоваться обновить базу данных клиентов в рамках нескольких разных playbooks. Если вы поместите все задачи, связанные с обновлением базы данных, в файл задач или роль, вы сможете повторно использовать их во многих playbooks, поддерживая их только в одном месте.
- Создание повторно используемых файлов и ролей
- Использование повторно playbooks
- Когда следует преобразовать playbook в роль
Создание повторно используемых файлов и ролей
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.
Вы можете выбрать, какой playbook импортировать во время выполнения, определив имя импортированного файла playbook с помощью переменной, а затем передав переменную с помощью --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
Если вы запустите этот playbook с ansible-playbook my_playbook -e import_from_extra_var=other_playbook.yml, Ansible импортирует как one_playbook.yml, так и other_playbook.yml.
Когда следует преобразовать playbook в роль
В некоторых случаях простые playbooks работают хорошо. Однако, начиная с определенного уровня сложности, роли работают лучше, чем playbooks. Роль позволяет хранить значения по умолчанию, обработчики, переменные и задачи в отдельных директориях вместо одного длинного документа. Роли легко делиться в Ansible Galaxy. В сложных случаях большинство пользователей считают роли более читаемыми, понятными и поддерживаемыми, чем playbooks со всем в одном файле.
Использование повторно файлов и ролей
Ansible предлагает два способа повторного использования файлов и ролей в playbook: динамическое и статическое.
-
Для динамического использования добавьте
include_*задачу в раздел задач плей: -
Для статического использования добавьте
import_*задачу в раздел задач плей:
Утверждения include и import задач могут использоваться на произвольной глубине.
Вы по-прежнему можете использовать ключевое слово roles на уровне плей для статического включения роли в playbook. Однако ключевое слово include, ранее использовавшееся для файлов задач и включений на уровне playbooks, теперь устарело.
Include: динамическое использование
Включение ролей, задач или переменных добавляет их в playbook динамически. Ansible обрабатывает включенные файлы и роли по мере их появления в playbook, поэтому включенные задачи могут быть подвержены влиянию результатов предыдущих задач в основном playbook. Включенные роли и задачи аналогичны обработчикам — они могут или не могут выполняться, в зависимости от результатов других задач в основном playbook.
Основное преимущество использования include_* инструкций заключается в циклах. Когда цикл используется с include, включенные задачи или роли будут выполняться один раз для каждого элемента в цикле.
Имена файлов включенных ролей, задач и переменных шаблонизируются перед включением.
Вы можете передавать переменные в include. Подробнее о наследовании и приоритете переменных см. в разделе Приоритет переменных: где следует поместить переменную?.
Import: статическое использование
Импортирование ролей, задач или playbooks добавляет их в playbook статически. Ansible предварительно обрабатывает импортированные файлы и роли перед запуском любых задач в playbook, поэтому импортированное содержимое никогда не зависит от других задач в основном playbook.
Имена файлов импортированных ролей и задач поддерживают шаблонизацию, но переменные должны быть доступны, когда Ansible предварительно обрабатывает импорты. Это можно сделать с помощью vars ключевого слова или с помощью --extra-vars.
Вы можете передавать переменные в импорты. Вам необходимо передавать переменные, если вы хотите запускать импортированный файл более одного раза в 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 |
С файлами переменных | Можно включить файлы переменных | Используйте |
Примечание
- Существуют также большие различия в потреблении ресурсов и производительности: импорты довольно экономичны и быстры, в то время как includes требуют много управления и учета.
Использование задач в качестве обработчиков
Вы также можете использовать 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
Вы можете запускать обработчики из импорта или инклюда, но процедура отличается для каждого метода повторного использования. Если вы используете include, вы должны сообщить об этом самому include, что запустит все задачи в restarts.yml. Если вы используете import, вы должны сообщить об этом каждой отдельной задаче в restarts.yml. Вы можете смешивать прямые задачи и обработчики с включенными или импортированными задачами и обработчиками.
Запуск включенных (динамических) обработчиков
Include выполняются во время выполнения, поэтому имя include существует во время выполнения плейбука, но включенные задачи не существуют до тех пор, пока сам include не будет запущен. Для использования задачи Restart apache с динамическим повторным использованием обратитесь к имени самого include. Этот подход запускает все задачи в включенном файле как обработчики. Например, с файлом задачи, показанным выше:
- 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–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse.html