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