Spec-Zone.ru › Ansible 2.8

Создание многократно используемых 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API