Создание многократно используемых Playbook
Хотя можно написать playbook в одном очень большом файле (и вы, возможно, начнете изучение playbooks именно так), со временем вам захочется переиспользовать файлы и начать организовывать вещи. В Ansible есть три способа сделать это: include, импорт и роли.
Include и импорт (добавлены в Ansible версии 2.4) позволяют пользователям разбивать большие playbooks на более мелкие файлы, которые можно использовать в нескольких родительских playbooks или даже несколько раз в одном playbook.
Роли позволяют упаковать вместе не только задачи, но и переменные, обработчики или даже модули и другие плагины. В отличие от include и импорта, роли также можно загружать и обмениваться через Ansible Galaxy.
Динамический против статического
Ansible имеет два режима работы для многократно используемого контента: динамический и статический.
В Ansible 2.0 был представлен концепция динамического include. Из-за некоторых ограничений в выполнении всех include динамически, в Ansible 2.1 была добавлена возможность принудительного использования статических include. Поскольку задача include стала перегруженной, чтобы охватить как статический, так и динамический синтаксис, и поскольку поведение по умолчанию include может изменяться в зависимости от других параметров, заданных для задачи, Ansible 2.4 вводит понятие include против import.
Если вы используете любую задачу import* (import_playbook, import_tasks, и т.д.), она будет статической. Если вы используете любую задачу include* (include_tasks, include_role, и т.д.), она будет динамической.
Задача include (которая использовалась как для файлов задач, так и для include на уровне playbook) по-прежнему доступна, однако теперь она считается устаревшей.
Различия между статическими и динамическими
Два режима работы довольно просты:
- Ansible предварительно обрабатывает все статические импорты во время парсинга playbook.
- Динамические include обрабатываются во время выполнения в тот момент, когда встречается эта задача.
Что касается параметров задач Ansible, таких как tags и условных операторов (when:) :
- Для статических импортов параметры родительской задачи будут скопированы во все дочерние задачи, содержащиеся в импорте.
- Для динамических include параметры задачи будут только применяться к динамической задаче по мере ее оценки и не будут копироваться в дочерние задачи.
Примечание
Роли — это несколько особый случай. До Ansible 2.3 роли всегда статически включались с помощью специального параметра roles: для данного play и всегда выполнялись первыми перед любыми другими задачами play (если не использовались pre_tasks). Роли по-прежнему можно использовать таким образом, однако Ansible 2.3 ввёл параметр include_role, чтобы разрешить выполнение ролей совместно с другими задачами.
Компромиссы и ловушки между include и импортом
Использование include* против import* имеет некоторые преимущества, а также некоторые компромиссы, которые пользователи должны учитывать при выборе каждого из них.
Основное преимущество использования include* операторов заключается в циклах. Когда цикл используется с include, включенные задачи или роль будут выполняться один раз для каждого элемента в цикле.
Использование include* имеет некоторые ограничения по сравнению с операторами import*:
- Теги, которые существуют только внутри динамического include, не будут отображаться в
--list-tagsвыводе. - Задачи, которые существуют только внутри динамического include, не будут отображаться в
--list-tasksвыводе. - Вы не можете использовать
notifyдля запуска имени обработчика, которое поступает из динамического include (см. примечание ниже). - Вы не можете использовать
--start-at-taskдля начала выполнения в задаче внутри динамического include.
Использование import* также может иметь некоторые ограничения по сравнению с динамическими include:
- Как отмечалось выше, циклы вообще нельзя использовать с импортами.
- При использовании переменных для имени целевого файла или роли переменные из источников инвентаризации (переменные хоста/группы и т. д.) использовать нельзя.
Примечание
Что касается использования notify для динамических задач: всё ещё возможно запустить сам динамический include, что приведет к выполнению всех задач внутри include.
См. также
- Модули утилит
- Документация модулей
include*иimport*, обсуждаемых здесь. - Работа с playbooks
- Обзор основных функций языка playbook.
- Использование переменных
- Все о переменных в playbooks.
- Условные операторы
- Условные операторы в playbooks.
- Циклы
- Циклы в playbooks.
- Рекомендованные подходы
- Различные советы по управлению playbooks в реальном мире.
- Ansible Galaxy
- Как делиться ролями в galaxy, управление ролями.
- Примеры Ansible на GitHub
- Полные файлы playbook из исходного кода проекта 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.8/user_guide/playbooks_reuse.html