Поиск…


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

Ansible использует концепцию ролей, чтобы лучше допускать модульный код и избегать повторения.

Роль - это просто структура папок, которая Ansible знает, где загрузить файлы, задачи и обработчики vars. Пример может выглядеть примерно так:

apache/
├── defaults
│   └── main.yml
├── files
│   ├── mod-pagespeed-stable_current_i386.deb
│   ├── mod-pagespeed-stable_current_i386.rpm
│   ├── mod-pagespeed-stable_current_amd64.deb
|   └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│   ├── debian.yml
│   ├── main.yml
│   └── redhat.yml
├── templates
│   ├── httpd.conf.j2
│   └── sites-available
│       └── virthualhost.conf.j2
└── vars
    ├── debian
    └── redhat

Затем вы можете использовать эту роль в основной игровой книге, которая выглядит следующим образом:

- hosts: webservers
  roles:
     - apache

Когда вы запускаете Ansible против этой пьесы, он будет нацеливаться на всех хостов в группе webservers и запускать apache выше роль apache , автоматически загружая любые переменные по умолчанию для этой роли и запуская все задачи, включенные в tasks/main.yml . Ansible также знает, как искать определенные типы файлов в дружественных ролях местах:

  • Если существуют роли / x / tasks / main.yml, в игру будут добавлены перечисленные в них задачи

  • Если существуют роли / x / handlers / main.yml, в игру будут добавлены обработчики, перечисленные в нем.

  • Если существуют роли / x / vars / main.yml, в игру будут добавлены переменные, перечисленные в ней

  • Если существуют роли / x / meta / main.yml, любые перечисленные в нем зависимые роли будут добавлены в список ролей (1.3 и более поздних)

  • Любая копия, сценарий, шаблон или включенные задачи (в роли) могут ссылаться на файлы в ролях / x / {файлах, шаблонах, задачах} / (dir зависит от задачи), не требуя их относительно или абсолютно

Ролевые зависимости

Роли также позволяют вам определять другие роли как зависимость, создавая файл meta/main.yml с блоком dependencies :

dependencies:
  - role: common

Также возможно передать значение параметру / переменной в зависимой роли:

dependencies:
  - { role: common, some_parameter: 3 }

Или даже выполнить зависимую роль условно:

dependencies:
  - { role: common, some_parameter: 3 }
  - { role: sshd, enable_sshd: false,
                         when: environment == 'production' }

Зависимые роли всегда выполняются перед ролями, которые зависят от них. Кроме того, они выполняются только один раз. Если две роли заявляют то же, что и их зависимость, она выполняется только в первый раз.

Представьте себе роли role1, role2 и role3 с текстом meta/main.yml :
role1 / мета / main.yml:

dependencies:
    - role: role3

роль2 / мета / main.yml:

dependencies:
    - role: role3

При выполнении role1 и role2 в одной и той же playbook (с ролью1, вызываемой до role2), порядок выполнения будет следующим:

role3 -> role1 -> role2

Вы можете переопределить это поведение, указав allow_duplicates: yes в meta/main.yml роли1 и role2. Результирующий порядок выполнения будет следующим:

role3 -> role1 -> role3 -> role2

Разделение конкретных задач и переменных распределения внутри роли

Мы можем легко разделить конкретные задачи и переменные дистрибутива на разные выделенные файлы .yml. Ansible помогает нам автоматически идентифицировать распределение целевых хостов через {{ ansible_distribution }} и {{ ansible_distribution_version }} , поэтому мы просто должны назвать соответствующие дистрибутивы .yml-файлам соответственно.

Для Ubuntu Xenial основная роль dir tree будет выглядеть примерно так:

role
├── tasks
│   ├── main.yml
│   └── Ubuntu16.04.yml
└── vars
    └── Ubuntu16.04.yml

Внутри tasks/main.yml теперь мы можем автоматически включать правильные переменные и задачи для распределения целевых хостов.

Задачи / main.yml

---

- name: include distribution specific vars
  include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"

- name: include distribution specific install
  include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"

Внутри tasks/Ubuntu16.06.yml и vars/Ubuntu16.04.yml теперь мы можем определить задачи и переменные для Ubuntu Xenial соответственно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow