Согласно документам Ansible, Playbook :
... основа для действительно простого управления конфигурацией и системы развертывания на нескольких машинах, в отличие от уже существующих, и очень хорошо подходящей для развертывания сложных приложений.
И, опять же, согласно тем же документам, Роли :
... способы автоматической загрузки определенных файлов vars_files, задач и обработчиков на основе известной файловой структуры. Группирование контента по ролям также позволяет легко делиться ролями с другими пользователями.
Однако различие между ними и их разными вариантами использования для меня не сразу очевидно. Например, если я настрою свой /etc/ansible/hosts
файл так, чтобы он выглядел так:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
... тогда что это за " [databases]
" запись ... роль ? Или где-нибудь имя YAML-файла playbook? Или что-то другое?!?
Если бы кто-нибудь мог объяснить мне различия в них, мое понимание Ansible значительно улучшилось!
- Playbook vs Role vs
[databases]
и подобные записи в/etc/ansible/hosts
- Если Playbook определены внутри файлов YAML, то где же определяются роли?
- Помимо
ansible.cfg
живого на сервере Ansible, как мне добавить / настроить Ansible с доступными Playbooks / ролями? Например, когда я бегуansible-playbook someplaybook.yaml
, как Ansible узнает, где найти эту книгу?
источник
tasks
делать вещи.playbooks
организовывать и запускать задачи.roles
организовывать группы задач, обработчиков и т. д., которые выполняют определенную функцию. Некоторыеplaybook
необходимы для запускаrole
(ов). Что бы вы назвали коллекциейroles
иplaybooks
? Скажем, например, тот, который управляет конфигурацией всех хостов на вашем сайте?Ответы:
[databases]
одно имя для группы хостов. Это позволяет вам ссылаться на несколько хостов по одному имени.Роль - это набор задач и дополнительных файлов для настройки хоста для выполнения определенной роли .
Playbook - это сопоставление хостов и ролей.
Пример из документации описывает пример проекта. Он содержит две вещи:
site.yml
,webservers.yml
,fooservers.yml
Являются playbooks.roles/common/
иroles/webservers/
содержат определенияcommon
иwebservers
роли соответственно.Внутри playbook (
webservers.yml
) у вас есть что-то вроде:Они определены внутри
roles/*
каталогов. Роли определяются в основном с помощью файлов YAML, но также могут содержать ресурсы любых типов (files/
,templates/
). Согласно документации определение роли структурировано следующим образом:Самый важный файл -
roles/x/tasks/main.yml
здесь вы определяете задачи, которые будут выполняться при выполнении роли.Будет искать пьесу внутри текущего каталога.
Буду искать пьесу внутри
somedir/somedir/
каталога.Вы обязаны разместить свой проект со всеми сценариями и ролями на сервере. Ansible не имеет к этому никакого отношения.
источник
webservers.yml
сборник пьес отображает[webservers]
размещающиеcommon
иwebservers
роли. Но что именно входит вcommon
роль? Нет способа определить это в каталогах, так есть ли обычно файлы YAML внутри этих "каталогов ролей"? Еще раз спасибо!Роли - это способ группировать задачи в один контейнер. У вас может быть роль для настройки MySQL, другая - для настройки Postfix и т. Д.
Пособие определяет, что и где происходит . Это место, где вы определяете хосты (группы хостов, см. Ниже) и роли, которые будут применяться к этим хостам.
[databases]
а другие записи в вашем инвентаре - это группы хостов. Группы хостов определяют набор хостов, на которых будет проходить игра.Игра - это набор задач или ролей (или и того, и другого) внутри сборника пьес. В большинстве случаев (и примеров) playbook будет содержать только одну игру. Но вы можете иметь столько, сколько захотите. Это означает, что у вас может быть playbook, который будет запускать роль
postfix
в группе хостовmail_servers
и рольmysql
в группе хостовdatabases
:В Ansible практически все определяется в YAML, что учитывается для ролей и сценариев.
AFAIK вы должны указать путь к playbook при вызове
ansible-playbook
. Такansible-playbook someplaybook.yaml
было бы ожидать ,someplaybook.yaml
чтобы быть в вас текущем каталоге. Но вы можете указать полный путь:ansible-playbook /path/to/someplaybook.yaml
источник
Это терминологический / семантический вопрос. Это может быть субъективным, даже если есть базовое определение.
Моя точка зрения такова:
Любая система управления конфигурацией / развертывания имеет:
source data
- данные, используемые для создания конфигурации целевого хостаtarget data
- данные, используемые для идентификации целевых хостовconfig changes
- список / набор правил / действий, которые мы применяем кsource data
целевому хосту на основеtarget data
В терминах Ansible:
source data
- это различные места, в которые мы можем поместить данные -group_vars
,playbook
vars,role
vars и т. д. Эти места влияют на приоритет (если переменная с таким же именем переопределяется в разных местах, существуют очень конкретные правила того, каким будет значение переменная во времяansible
/ansible-playbook
выполнениеtarget data
- это инвентарь (и, также можно определить переменные инвентаря / группы хостов внутри инвентаря!)config changes
- ansible имеет 4 уровня абстракции:role
s /task
s / списков задач (и специальных задач, напримерhandlers
)С точки зрения программного обеспечения роль должна быть достаточно общей, чтобы ее можно было использовать повторно .
Также в некоторых (довольно больших) организациях «роли» поставляются группой A, тогда как они используются в сценариях, поддерживаемых группой B.
резюме
Все вышесказанное позволяет сгруппировать похожие конфигурации - в файл
role
. группирование связанных подсистем / компонентов в однуplaybook
. Кроме того , стоит упомянуть, 1 YAML пункт в сборник пьес ( в том числеhosts:
и один илиtasks
,pre_tasks
,post_tasks
,roles
) называетсяplay
Теперь к вашему вопросу:
Да, это сначала сбивает с толку.
Обычно вы связываете
source data
себя с семантикой своей роли, поэтому, когда вы видите эту рольsetup_db
применяется в игре к связанной группе хостов (например,db_hosts
), ноplay
может выполняться объединение нескольких групп хостов. Это просто вопрос условности против гибкости.PS
Пожалуйста, напишите мне, добавило ли это путаницы или прояснило. Спасибо.
источник
Также имейте в виду, что playbook может вызывать несколько ролей, если используется метафайл, предназначенный для воздействия на разные роли.
Пример пособия: dual_role-playbook.yml
Схема папок и файлов ролей будет выглядеть так:
источник
Проще говоря:
Playbook похож на основную программу, он содержит полные инструкции для завершения работы. Однако для больших проектов нежелательно вдаваться в подробности. Итак, вам нужна роль.
Роль - это подпрограмма, которая обычно достигает одной цели, например, настраивает сервер базы данных. Вы можете поместить его в
roles/
каталог или загрузить сторонние роли, указав URIrolesfile.yml
и спросив ansible-galaxy загрузить их для вас.Это
[database]
группа хостов, определенная в файле инвентаризации, в котором перечислены хосты, принадлежащиеdatabase
группе. Вы также можете указать группу веб-серверов, указав что-то вродеГруппа
web
илиdatabase
затем может использоваться в сценариях или ролях для указания применяемых хостов.Группы также можно использовать в команде
ansible
для выполнения специальных команд.источник