Поиск по сайту:

Работа с операторами включения и импорта в 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 проект для достижения модульности.

Статьи по данной тематике