Работа с операторами включения и импорта в Ansible
Как включить/импортировать плейбуки в Ansible
Когда вы создаете сборник сценариев Ansible для более крупных проектов, объединение всех задач в один сборник сценариев усложнит проект. Лучше всего сгруппировать задачи в отдельные сборники сценариев. Это поможет вам разбить проект и достичь модульности в Ansible. В ansible вы можете разбить playbook, задачу и импортировать их с помощью "import_*
" и "include_*
"< директивы. В этой статье мы научимся работать с операторами include
и import
в Ansible на примерах.
В следующих разделах я покажу, как импортировать книги игр, задачи и роли на простых примерах. Если вам нужна лаборатория ansible для практики, ознакомьтесь с нашим руководством по настройке лаборатории ansible с использованием Vagrant и Virtualbox по ссылке ниже.
Автоматическая установка Ansible Lab с Vagrant и Virtualbox в Linux
Включает против импорта
Как указано в официальной документации Ansible,
операторы
include
иimport
очень похожи, однако механизм выполнения Ansible обрабатывает их совершенно по-разному.
- Все операторы
import*
предварительно обрабатываются во время анализа сборников сценариев.- Все инструкции
include*
обрабатываются по мере их появления во время выполнения книги сценариев.
Директива "import_playbook
" представлена в ansible версии 2.4, а до нее - только в include_playbook
был доступен. В версии 2.4 доступна только директива import_playbook
. Если вы попытаетесь использовать директиву include_playbook
в более старых версиях, вы получите следующую ошибку.
ERROR! 'include_playbook' is not a valid attribute for a Play
Импорт Ansible Playbook
Вы можете создать несколько сборников пьес в соответствии с характером воспроизведения и, наконец, импортировать их в один файл YAML и запустить сборник пьес.
Я создал три сборника пьес.
- Первая книга пьес —
playbook1.yml
- Вторая книга пьес —
playbook2.yml
- Основная книга воспроизведения —
main.yml
Структура проекта
Первая и вторая пьесы содержат следующее определение игры.
# playbook1.yml
- name: Playbook imports
hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Task Import
ansible.builtin.debug:
msg: "Importing playbook1.yml"
# playbook2.yml
- name: Playbook imports
hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Task Import 2
ansible.builtin.debug:
msg: "Importing playbook2.yml"
Основная книга воспроизведения используется для импорта как playbook1.yml
, так и playbook2.yml
.
- import_playbook: playbook1.yml
- import_playbook: playbook2.yml
Выполнение команды ansible-playbook
для main.yml
импортирует playbook1.yml
и playbook2.yml
в текущее пространство имен и выполните задачи.
ansible-playbook main.yml
PLAY [Playbook imports] **********************************************************************************
TASK [Task Import] ***************************************************************************************
ok: [localhost] => {
"msg": "Importing playbook1.yml"
}
PLAY [Playbook imports] **********************************************************************************
TASK [Task Import 2] *************************************************************************************
ok: [localhost] => {
"msg": "Importing playbook2.yml"
}
Импорт книги игр
Применение других директив с помощью import_playbook
Вы можете применять другие директивы, такие как теги, условные операторы и т. д., с помощью директивы import_playbook
. Директива на уровне импорта будет унаследована всеми задачами playbook.
Чтобы лучше это понять, рассмотрим приведенный ниже пример. Все, что я сделал, это просто добавил условный оператор в файл main.yml
.
- import_playbook: playbook1.yml
when: run is defined
- import_playbook: playbook2.yml
when: run is defined
Когда я запускаю эту книгу воспроизведения, воспроизведение и задача импортируются в пространство имен и проверяются, определена ли переменная "run
" для всех задач. Поскольку переменная не определена, задачи пропускаются.
PLAY [Playbook imports] **********************************************************************************
TASK [Task Import] ***************************************************************************************
skipping: [localhost]
PLAY [Playbook imports] **********************************************************************************
TASK [Task Import 2] *************************************************************************************
skipping: [localhost]
Я снова запускаю playbook, устанавливая var=1
только в playbook2. На этот раз задача в playbook2 прошла нормально, а задачи playbook1 были пропущены.
PLAY [Playbook imports] ********************************************************************************************************
TASK [Task Import] *************************************************************************************************************
skipping: [localhost]
PLAY [Playbook imports] ********************************************************************************************************
TASK [Task Import 2] ***********************************************************************************************************
ok: [localhost] => {
"msg": "Importing playbook2.yml"
}
PLAY RECAP *********************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Условная проверка — импорт Playbook
Импорт задач Ansible Playbook
Подобно импорту сборников сценариев, вы можете создавать отдельные файлы задач и импортировать их в один файл. В то время как в сборниках пьес можно использовать только директиву импорта, задачи могут использовать как директиву импорта, так и директиву включения.
Сначала давайте взглянем на директиву import_task
, которая аналогична директиве import_playbook
. Директива будет предварительно анализировать задачу при анализе плейбука.
Я создал два файла с именами task1.yml
и main.yml
. Он содержит следующие определения игр и задач.
# task1.yml
- name: importing_tasks
ansible.builtin.debug:
msg: "Importing the task from task1.yml"
# main.yml
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- import_tasks: task1.yml
Директива задачи импорта
Если вы посмотрите на приведенный выше вывод, задача будет импортирована в пространство имен main.yml
и запущена.
Директива include_tasks
будет анализироваться только во время выполнения плейбука. Я использую ту же книгу игр main.yml
и task1.yml
, но с небольшими изменениями.
# main.yml
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- include_tasks: task1.yml
# task1.yml
- name: importing tasks using include directive
ansible.builtin.debug:
msg: "Importing the task from task1.yml using include directive"
При отправке плейбука выполнялись две задачи, хотя в плейбуке определена только одна задача. Первая задача — анализ задач из task1.yml
и включение их для выполнения. Вторая задача выполняет включенные задачи.
Включить директиву задачи
Подобно директиве import_playbook
, вы можете применить другие директивы ansible к директиве import_tasks
или include_tasks
.
Я создал файл task2.yml
и использовал директиву block для импорта и включения task1.yml
и task2.yml
.
# task2.yml
- name: importing tasks using include directive
ansible.builtin.debug:
msg: "Importing the task from task2.yml using import directive"
# main.yml
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- name: Import and include with block directive
block:
- include_tasks: task1.yml
- import_tasks: task2.yml
Импорт и включение с помощью директивы блока
Импорт ролей Ansible Playbook
Роли — отличный способ организовать ваш проект. У нас есть подробная статья о ролях Ansible и о том, как директивы импорта и включения используются в качестве альтернативы директивам ролей. Предлагаю вам посмотреть его по ссылке ниже.
Роли Ansible для начинающих
Заключение
В этой статье мы увидели, что такое директивы import_*
и include_*
и как их использовать для разделения ansible проект для достижения модульности.