Spec-Zone.ru › Ansible

Использование повторно артефактов Ansible

Вы можете написать простой playbook в одном очень большом файле, и большинство пользователей сначала изучают подход с одним файлом. Однако разделение работы по автоматизации на более мелкие файлы — отличный способ организовать сложные наборы задач и повторно использовать их. Более мелкие и распределенные артефакты позволяют повторно использовать те же переменные, задачи и плейы во множестве playbooks для решения различных задач. Вы можете использовать распределенные артефакты в нескольких родительских playbooks или даже несколько раз в одном playbook. Например, вам может потребоваться обновить базу данных клиентов в рамках нескольких разных playbooks. Если вы поместите все задачи, связанные с обновлением базы данных, в файл задач или роль, вы сможете повторно использовать их во многих playbooks, поддерживая их только в одном месте.

  • Создание повторно используемых файлов и ролей
  • Использование повторно playbooks
  • Когда следует преобразовать playbook в роль
  • Использование повторно файлов и ролей

    • Include: динамическое использование
    • Import: статическое использование
    • Сравнение include и import: динамическое и статическое использование
  • Использование повторно задач как обработчиков

    • Вызов включенных (динамических) обработчиков
    • Вызов импортированных (статических) обработчиков

Создание повторно используемых файлов и ролей

Ansible предлагает четыре распределенных, повторно используемых артефакта: файлы переменных, файлы задач, playbooks и роли.

  • Файл переменных содержит только переменные.
  • Файл задач содержит только задачи.
  • Playbook содержит по крайней мере один плей и может содержать переменные, задачи и другое содержимое. Вы можете повторно использовать узкоспециализированные playbooks, но можете использовать их только статически, а не динамически.
  • Роль содержит набор связанных задач, переменных, значений по умолчанию, обработчиков и даже модулей или других плагинов в определенном файловой структуре. В отличие от файлов переменных, файлов задач или playbooks, роли легко загружать и обмениваться через Ansible Galaxy. Подробную информацию о создании и использовании ролей см. в разделе Роли.

Введено в версии 2.4.

Использование повторно playbooks

Вы можете включить несколько playbooks в основной playbook. Однако вы можете использовать только импорты для повторного использования playbooks. Например:

- import_playbook: webservers.yml
- import_playbook: databases.yml

Импорт включает playbooks в другие playbooks статически. Ansible выполняет плейы и задачи в каждом импортированном playbook в порядке их перечисления, так как если бы они были определены непосредственно в основном playbook.

Вы можете выбрать, какой playbook импортировать во время выполнения, определив имя импортированного файла playbook с помощью переменной, а затем передав переменную с помощью --extra-vars или vars ключевого слова. Например:

- import_playbook: "/path/to/{{ import_from_extra_var }}"
- import_playbook: "{{ import_from_vars }}"
  vars:
    import_from_vars: /path/to/one_playbook.yml

Если вы запустите этот playbook с ansible-playbook my_playbook -e import_from_extra_var=other_playbook.yml, Ansible импортирует как one_playbook.yml, так и other_playbook.yml.

Когда следует преобразовать playbook в роль

В некоторых случаях простые playbooks работают хорошо. Однако, начиная с определенного уровня сложности, роли работают лучше, чем playbooks. Роль позволяет хранить значения по умолчанию, обработчики, переменные и задачи в отдельных директориях вместо одного длинного документа. Роли легко делиться в Ansible Galaxy. В сложных случаях большинство пользователей считают роли более читаемыми, понятными и поддерживаемыми, чем playbooks со всем в одном файле.

Использование повторно файлов и ролей

Ansible предлагает два способа повторного использования файлов и ролей в playbook: динамическое и статическое.

  • Для динамического использования добавьте include_* задачу в раздел задач плей:

    • include_role
    • include_tasks
    • include_vars
  • Для статического использования добавьте import_* задачу в раздел задач плей:

    • import_role
    • import_tasks

Утверждения include и import задач могут использоваться на произвольной глубине.

Вы по-прежнему можете использовать ключевое слово roles на уровне плей для статического включения роли в playbook. Однако ключевое слово include, ранее использовавшееся для файлов задач и включений на уровне playbooks, теперь устарело.

Include: динамическое использование

Включение ролей, задач или переменных добавляет их в playbook динамически. Ansible обрабатывает включенные файлы и роли по мере их появления в playbook, поэтому включенные задачи могут быть подвержены влиянию результатов предыдущих задач в основном playbook. Включенные роли и задачи аналогичны обработчикам — они могут или не могут выполняться, в зависимости от результатов других задач в основном playbook.

Основное преимущество использования include_* инструкций заключается в циклах. Когда цикл используется с include, включенные задачи или роли будут выполняться один раз для каждого элемента в цикле.

Имена файлов включенных ролей, задач и переменных шаблонизируются перед включением.

Вы можете передавать переменные в include. Подробнее о наследовании и приоритете переменных см. в разделе Приоритет переменных: где следует поместить переменную?.

Import: статическое использование

Импортирование ролей, задач или playbooks добавляет их в playbook статически. Ansible предварительно обрабатывает импортированные файлы и роли перед запуском любых задач в playbook, поэтому импортированное содержимое никогда не зависит от других задач в основном playbook.

Имена файлов импортированных ролей и задач поддерживают шаблонизацию, но переменные должны быть доступны, когда Ansible предварительно обрабатывает импорты. Это можно сделать с помощью vars ключевого слова или с помощью --extra-vars.

Вы можете передавать переменные в импорты. Вам необходимо передавать переменные, если вы хотите запускать импортированный файл более одного раза в playbook. Например:

tasks:
- import_tasks: wordpress.yml
  vars:
    wp_user: timmy

- import_tasks: wordpress.yml
  vars:
    wp_user: alice

- import_tasks: wordpress.yml
  vars:
    wp_user: bob

Подробнее о наследовании и приоритете переменных см. в разделе Приоритет переменных: где следует поместить переменную?.

Сравнение include и import: динамическое и статическое использование

Каждый подход к повторному использованию распределенных артефактов Ansible имеет свои преимущества и ограничения. Вы можете выбрать динамическое использование для некоторых playbooks и статическое использование для других. Хотя вы можете использовать как динамическое, так и статическое использование в одном playbook, лучше всего выбрать один подход на playbook. Смешивание статического и динамического использования может привести к трудно диагностируемым ошибкам в ваших playbooks. Эта таблица обобщает основные различия, чтобы вы могли выбрать лучший подход для каждого создаваемого playbook.

Include_*

Import_*

Тип использования

Динамический

Статический

Обработка

Во время выполнения, при встрече

Предварительная обработка при разборе playbook

Задача или плей

Все include — это задачи

import_playbook не может быть задачей

Опции задачи

Применяются только к самой задаче include

Применяются ко всем дочерним задачам в импорте

Вызов из циклов

Выполняется один раз для каждого элемента цикла

Не может использоваться в цикле

Использование тегов

Теги внутри include не перечислены

Все теги появляются с --list-tags

Использование задач

Задачи внутри include не перечислены

Все задачи отображаются с --list-tasks

Уведомление обработчиков

Нельзя вызвать обработчики внутри include

Можно вызвать отдельные импортированные обработчики

Запуск с задач

Нельзя начинать с задач внутри include

Можно начинать с импортированных задач

Использование переменных инвентаризации

Можно include_*: {{ inventory_var }}

Нельзя import_*: {{ inventory_var }}

С playbooks

Нельзя include_playbook

Можно импортировать полные playbooks

С файлами переменных

Можно включить файлы переменных

Используйте vars_files: для импорта переменных

Примечание

  • Существуют также большие различия в потреблении ресурсов и производительности: импорты довольно экономичны и быстры, в то время как includes требуют много управления и учета.

Использование задач в качестве обработчиков

Вы также можете использовать include и import в разделе Обработчики: выполнение операций при изменении плейбука. Например, если вы хотите определить, как перезапустить Apache, вам нужно сделать это только один раз для всех ваших плейбуков. Вы можете создать файл restarts.yml, который будет выглядеть так:

# restarts.yml
- name: Restart apache
  ansible.builtin.service:
    name: apache
    state: restarted

- name: Restart mysql
  ansible.builtin.service:
    name: mysql
    state: restarted

Вы можете запускать обработчики из импорта или инклюда, но процедура отличается для каждого метода повторного использования. Если вы используете include, вы должны сообщить об этом самому include, что запустит все задачи в restarts.yml. Если вы используете import, вы должны сообщить об этом каждой отдельной задаче в restarts.yml. Вы можете смешивать прямые задачи и обработчики с включенными или импортированными задачами и обработчиками.

Запуск включенных (динамических) обработчиков

Include выполняются во время выполнения, поэтому имя include существует во время выполнения плейбука, но включенные задачи не существуют до тех пор, пока сам include не будет запущен. Для использования задачи Restart apache с динамическим повторным использованием обратитесь к имени самого include. Этот подход запускает все задачи в включенном файле как обработчики. Например, с файлом задачи, показанным выше:

- name: Trigger an included (dynamic) handler
  hosts: localhost
  handlers:
    - name: Restart services
      include_tasks: restarts.yml
  tasks:
    - command: "true"
      notify: Restart services

Запуск импортированных (статических) обработчиков

Импорты обрабатываются до начала плейбука, поэтому имя импорта больше не существует во время выполнения плейбука, но имена отдельных импортированных задач существуют. Для использования задачи Restart apache со статическим повторным использованием обратитесь к имени каждой задачи или задач в импортированном файле. Например, с файлом задачи, показанным выше:

- name: Trigger an imported (static) handler
  hosts: localhost
  handlers:
    - name: Restart services
      import_tasks: restarts.yml
  tasks:
    - command: "true"
      notify: Restart apache
    - command: "true"
      notify: Restart mysql

См. также

Модули утилит

Документация по модулям include* и import* , обсуждаемым здесь.

Работа с плейбуками

Обзор основных функций языка плейбука

Использование переменных

Все о переменных в плейбуках

Условные операторы

Условные операторы в плейбуках

Циклы

Циклы в плейбуках

Общие советы

Советы и рекомендации по плейбукам

Руководство пользователя Galaxy

Как делиться ролями в Galaxy, управление ролями

Общение

Есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по общению Ansible

© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse.html

Spec-Zone.ru

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