Подтвердить что ты не робот

Неспокойные книги против ролей

Согласно документам 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
  • Если в файлах YAML определены книги, то где определены роли?
  • Помимо ansible.cfg, живущего на сервере Ansible, как мне добавить/настроить Ansible с доступными Playbooks/Roles? Например, когда я запускаю ansible-playbook someplaybook.yaml, как Ansible знает, где найти эту книгу?
4b9b3361

Ответ 1

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

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

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

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

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

  • Playbooks. site.yml, webservers.yml, fooservers.yml - это проигрыватели.
  • Роли: 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

Если в файлах YAML определены книги, то где определены роли?

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

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

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

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

$ ansible-playbook someplaybook.yaml

Будет искать учебник в текущем каталоге.

$ ansible-playbook somedir/somedir/someplaybook.yaml

Посмотрите на playbook внутри каталога somedir/somedir/.

Это ваша обязанность поместить ваш проект со всеми игровыми книгами и ролями на сервере. Ansible не имеет к этому никакого отношения.

Ответ 2

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

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

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

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

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

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

Если в файлах YAML определены книги, то где определены роли?

В Ansible почти все определено в YAML, которое учитывает роли и playbooks.

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

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

Ответ 3

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

Мое мнение выглядит следующим образом:

Любая система управления/развертывания системы имеет:

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

В неотвратимых терминах:

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

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

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

Резюме

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

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

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

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

P.S.

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

Ответ 4

Также имейте в виду, что 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

Ответ 5

Проще говоря:

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

Роль - это подпрограмма, которая обычно выполняет одну задачу, например, настраивает сервер базы данных. Вы можете поместить его в каталог rolesfile.yml roles/ или загрузить сторонние роли, rolesfile.yml URI в rolesfile.yml и rolesfile.yml -galaxy загрузить их для вас.

[database] - это группа хостов, определенная в файле инвентаризации, в которой перечислены хосты, принадлежащие к группе database. Вы также можете указать группу веб-серверов, указав что-то вроде

[web]
web1.example.com
web2.example.com

web группа или database могут затем использоваться в книгах или ролях для указания хостов, к которым нужно применить.

Группы могут также использоваться в команде ansible для запуска специальных команд.