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