Ansible Playbooks vs роли

согласно Ansible docs, a Playbook есть:

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

и, опять же, согласно тем же документам, a роли являются:

...способы автоматической загрузки определенные vars_files, задачи и обработчики на основе известной файловой структуры. Группировка контента по ролям также позволяет легко обмениваться ролями с другими пользователями.

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

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

...тогда что это "[databases]" запись...а роль? Или имя файла YAML playbook где-то? Или что-то еще?!?

если бы кто-то мог объяснить мне различия на них, мое понимание Ansible было бы значительно улучшить!

  • Playbook vs роль vs [databases] и аналогичные записи в /etc/ansible/hosts
  • если Playbooks определены внутри файлов YAML, то где определены роли?
  • помимо ansible.cfg живя на сервере Ansible, как добавить / настроить Ansible с доступными книгами/ролями? Например, когда я бегу ansible-playbook someplaybook.yaml, как Анзибль знает, где найти эту книгу?

4 ответов


Playbook vs Role vs [базы данных] и аналогичные записи в /etc/ansible/hosts

[databases] - Это одно имя для группы хостов. Это позволяет ссылаться на несколько хостов по одному имени.

роль-это набор задач и дополнительных файлов для настройки хоста для обслуживания определенного роль.

Playbook-это сопоставление между хостами и ролями.

пример документация описывает пример проекта. Он содержит две вещи:

  • Playbooks. site.yml, webservers.yml, fooservers.yml являются playbooks.
  • ролях: roles/common/ и roles/webservers/ определения common и webservers соответственно роли.

внутри playbook (webservers.yml) у вас есть что-то вроде:

---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
     - common
     - webservers

если Playbooks определены внутри файлов YAML, то где определены роли?

они определены внутри roles/* справочники. Роли определяются в основном с помощью файлов YAML, но также могут содержать ресурсы любых типов (files/, templates/). Согласно документация определение роли структурировано следующим образом:

  • если роли / x / задачи / main.yml существует, перечисленные в нем задачи будут добавлены в игру
  • если роли / x / обработчики / main.yml существует, обработчики, перечисленные в нем, будут добавлены в play
  • Если роли / x/vars / main.в формате YML существует, перечисленные в нем переменные будут добавлены в игру
  • Если роли / x/meta / main.yml существует, любые зависимости ролей, перечисленные в нем, будут добавлены в список ролей (1.3 и более поздних версий)
  • любые задачи копирования могут ссылаться на файлы в ролях / x / files / без необходимости их относительного или абсолютного пути
  • любые задачи скриптов могут ссылаться на Скрипты В ролях / x / files / без необходимости их относительного или абсолютного пути
  • любые задачи шаблон ссылочные файлы в ролях / x / templates / без необходимости их относительного или абсолютного пути
  • любые задачи include могут ссылаться на файлы в ролях / x/ tasks / без необходимости их относительного или абсолютного пути

самый важный файл roles/x/tasks/main.yml, здесь вы определяете задачи, которые будут выполняться при выполнении роли.

кроме ансибля.cfg, живущий на сервере Ansible, как добавить / настроить Ansible с доступные сценарии/ролей? Например, когда я запускаю ansible-playbook someplaybook.ямл, откуда Ансибл знает, где найти эту книгу?

$ ansible-playbook someplaybook.yaml

будет искать playbook внутри текущего каталога.

$ ansible-playbook somedir/somedir/someplaybook.yaml

будет искать playbook внутри .

это ваша ответственность, чтобы поставить свой проект со всеми playbooks и ролей на сервере. Анзибль тут ни при чем.


Playbook vs Role vs [базы данных] и аналогичные записи в /etc/ansible/hosts

роли-это способ сгруппировать задачи в один контейнер. У вас может быть роль для настройки MySQL, другая для настройки Postfix и т. д.

playbook определяет что происходит здесь. Это место, где вы определяете хосты (группы хостов, см. ниже) и роли, которые будут применяться к тем принимать гостей.

[databases] и другие записи в вашем инвентаре являются hostgroups. Hostgroups определяют набор хостов, на которых будет выполняться игра.

пьеса представляет собой набор задач или ролей (или обоих) внутри playbook. В большинстве случаев (и примеров) playbook будет содержать только одну игру. Но ты можешь взять столько, сколько захочешь. Это означает, что у вас может быть playbook, который будет запускать роль postfix на hostgroup mail_servers роль mysql о группе узлов databases:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

если Playbooks определены внутри файлов YAML, то где определены роли?

в Ansible почти все определено в YAML, что имеет значение для ролей и playbooks.

кроме ансибля.cfg, живущий на сервере Ansible, как добавить / настроить Ansible с доступными книгами/ролями? Например, когда я запускаю ansible-playbook someplaybook.yaml, как Ansible знает, где найти что PlayBook?

AFAIK вы должны указать путь к playbook при вызове ansible-playbook. Так что ansible-playbook someplaybook.yaml ожидал someplaybook.yaml чтобы быть в текущем каталоге. Но вы можете предоставить полный путь:ansible-playbook /path/to/someplaybook.yaml


это терминологический / семантический вопрос. Это может быть субъективным, даже если есть базовое определение.

мой взгляд таков:

любая система управления конфигурацией / развертывания имеет:

  1. source data - данные, используемые для создания конфигурации целевого хоста
  2. target data - данные, используемые для определения целевых хостов
  3. config changes - список / набор правил / действий, которые мы применяем с source data за целевого узла target data

в Анзибль условия:

  1. source data - Это различные места, где мы можем поместить данные -group_vars, playbook vars,role vars, etc., Эти места влияют на приоритет (если переменная с тем же именем переопределяется в разных местах, существуют очень конкретные правила того, каким будет значение переменной во время ansible/ansible-playbook исполнение
  2. target data - это инвентарь (и, также можно определить инвентарь / hostgroup переменные внутри инвентаря!)
  3. config changes - ansible имеет 4 уровня абстракции для него:
    1. задач - одно действие
    2. список задач - список действий
    3. role-список действий (или список списков), сгруппированных по одному и тому же "субъекту", обычно все цели работают на одном хосте/hostgroup
    4. playbook-список пьес, каждая из которых работает на возможно различных hostgroup, применяя несколько roles/tasks / tasklists (и специальные такие задачи, как handlers)

из аспекта "программное обеспечение" - роль должна быть достаточно общей, чтобы быть повторно.

также в некоторых (довольно больших) организациях "роли" поставляются группой A, в то время как используются в playbooks, поддерживаемых группой B.

резюме

все вышеизложенное позволяет группировать аналогичные конфигурации-в role. группировка связанных подсистем / компонентов в одну playbook. Кроме того, стоит упомянуть, 1 элемент YAML в playbook (включая hosts: и или tasks, pre_tasks, post_tasks, roles) называется play

теперь для вашего вопроса:

Да, сначала это сбивает с толку.

вы обычно подключаете свой source data к семантике вашей роли, поэтому, когда вы видите эту роль setup_db применяется в игре на связанную хост-группу (например,db_hosts) Но play может выполняться объединение нескольких хост-групп. Это просто вопрос Конвенции против гибкость.

П. С.

пожалуйста, напишите мне, добавило ли это к путанице или прояснилось. Спасибо.


также имейте в виду, что playbook может вызывать несколько ролей, если используется мета-файл, предназначенный для влияния на разные роли.

пример Playbook: dual_role-playbook.в формате YML

- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

схема папок и файлов ролей будет выглядеть следующим образом:

dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2