ansible
Роли
Поиск…
Использование ролей
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 соответственно.