Spec-Zone.ru › Ansible 2.4

Создание многократно используемых Playbook

  • Включение и импорт
  • Роли

Хотя можно написать playbook в одном очень большом файле (и вы можете начать изучение playbooks именно так), в конечном итоге вам захочется повторно использовать файлы и начать организовывать вещи. В 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, и т.д.), она будет динамической.

Задача bare 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* также может иметь некоторые ограничения по сравнению с динамическими включениями:

  • Как отмечалось выше, циклы вообще нельзя использовать с импортами.
  • При использовании переменных для имени целевого файла или роли переменные из источников инвентаризации (переменные хоста/группы и т. д.) использовать нельзя.

Примечание

Что касается использования notify для динамических задач: все еще возможно запустить само динамическое включение, что приведет к выполнению всех задач внутри включения.

См. также

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.4/playbooks_reuse.html

Spec-Zone.ru

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