Ansible Playbooks vs Roles


97

Згідно з документами Ansible, Книга Play :

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

І, знову ж таки, згідно з тими самими документами, Ролі такі:

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

Однак різниця між цими та різними випадками використання для мене не очевидна. Наприклад, якщо я налаштую свій /etc/ansible/hostsфайл так:

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

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

... тоді що це за [databases]"запис" ... роль ? Або ім’я файлу YAML із плейбуком десь? Або щось інше?!?

Якби хтось міг пояснити мені різницю в цих питаннях, моє розуміння Ansible було б значно покращено!

  • Playbook vs Role vs [databases]та подібні записи в/etc/ansible/hosts
  • Якщо Playbook визначено всередині файлів YAML, то де визначені Ролі?
  • Окрім ansible.cfgживого на сервері Ansible, як мені додати / налаштувати Ansible за допомогою доступних Playbooks / Roles? Наприклад, коли я біжу ansible-playbook someplaybook.yaml, як Ansible знає, де знайти цю книгу?

1
Ролі - це спосіб зробити код у ігрових книгах багаторазовим, додавши цю функціональність до узагальнених "бібліотек", які потім можна використовувати в будь-якій книзі ігор за потреби.
Хуан Хіменес

tasksробити речі. playbooksорганізовувати та запускати завдання. rolesорганізовувати групи завдань, обробників тощо, які виконують певну функцію. Деякі playbookпотрібні для запуску role(ив). Що б ви назвали колекцією rolesта playbooks? Скажімо, наприклад, такий, який керує конфігурацією всіх хостів на вашому сайті?
fbicknel

Відповіді:


110

Playbook vs Role vs [бази даних] та подібні записи в / etc / ansible / hosts

[databases]є єдиною назвою для групи хостів. Це дозволяє посилатися на кілька хостів під одним іменем.

Роль - це набір завдань та додаткових файлів для налаштування хоста, який служитиме для певної ролі .

Playbook - це відображення між ведучими та ролями.

Приклад з документації описує приклад проекту. Він містить дві речі:

  • Книжки ігор. 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

Якщо Playbook визначено всередині файлів YAML, то де визначені Ролі?

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

  • Якщо role / x / tasks / main.yml існує, перераховані там завдання будуть додані до відтворення
  • Якщо role / x / handlers / main.yml існує, перераховані там обробники будуть додані до відтворення
  • Якщо role / x / vars / main.yml існує, перелічені там змінні будуть додані до відтворення
  • Якщо role / x / meta / main.yml існує, будь-які перелічені там залежності ролей будуть додані до списку ролей (1.3 та новіших версій)
  • Будь-яке завдання копіювання може посилатися на файли в ролях / x / files / без необхідності відносно або абсолютно їх перенаправляти
  • Будь-які завдання скрипта можуть посилатися на сценарії у ролях / x / files / без необхідності відносно або абсолютно їх перекладати
  • Будь-яке завдання шаблону може посилатися на файли в ролях / x / templates / без необхідності їх відносного або абсолютного шляху
  • Будь-які завдання із включенням можуть посилатися на файли в ролях / x / tasks / без необхідності відносно або абсолютно їх перенаправляти

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

Окрім ansible.cfg, який живе на сервері Ansible, як мені додати / налаштувати Ansible з наявними Playbooks / Roles? Наприклад, коли я запускаю ansible-playbook someplaybook.yaml, як Ansible знає, де знайти цю книгу?

$ ansible-playbook someplaybook.yaml

Шукатиме програму збірки в поточному каталозі.

$ ansible-playbook somedir/somedir/someplaybook.yaml

Шукатиме книгу ігор у somedir/somedir/каталозі.

Ви несете відповідальність розмістити свій проект з усіма іграшками та ролями на сервері. Ansible не має нічого спільного з цим.


Дякую @Yaroslav Admin (+1) - одне швидке подальше запитання: ви заявляєте, що ролі визначаються всередині каталогів , але що ж насправді налаштовує роль? Іншими словами, webservers.ymlігровий зошит відображає [webservers]ведучих до ролі commonі webservers. Але що саме входить до commonролі? Немає можливості визначити це в каталогах, тож чи є, як правило, файли YAML всередині цих "каталогів ролей"? Знову дякую!
smeeb

@smeeb Так, ти маєш рацію, роль визначається файлами всередині цього каталогу. Вони в основному є YAML, але можуть містити й інші типи файлів. Докладнішу інформацію див. В оновленій відповіді.
Ярослав Адмін

36

Playbook vs Role vs [бази даних] та подібні записи в / etc / ansible / hosts

Ролі - це спосіб групувати завдання разом в один контейнер. Ви можете мати роль для налаштування MySQL, іншу для налаштування Postfix тощо.

Книга ігор визначає, що де відбувається . Тут ви визначаєте хости (групи хостів, див. Нижче) та ролі, які будуть застосовані до цих хостів.

[databases]а інші записи у вашому інвентарі - це групи хостів. Групи хостів визначають набір ведучих, на яких триватиме відтворення.

Вистава - це набір завдань або ролей (або обох) всередині ігрової книги. У більшості випадків (і прикладів) ігровий збірник міститиме лише одну окрему п’єсу. Але ви можете мати скільки завгодно. Це означає , що ви могли б мати збірник п'єс , який буде працювати роль postfixна hostgroup mail_serversі ролі mysqlна hostgroup databases:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

Якщо Playbook визначено всередині файлів YAML, то де визначені Ролі?

В Ansible майже все визначено в YAML, що враховує ролі та ігрові книги.

Окрім ansible.cfg, який живе на сервері Ansible, як мені додати / налаштувати Ansible з наявними Playbooks / Roles? Наприклад, коли я запускаю ansible-playbook someplaybook.yaml, як Ansible знає, де знайти цю книгу?

AFAIK ви повинні вказати шлях до ігрової книги під час виклику ansible-playbook. Тому ansible-playbook someplaybook.yamlсподіваюся, someplaybook.yamlщо ви знаходитесь у поточному каталозі. Але ви можете надати повний шлях:ansible-playbook /path/to/someplaybook.yaml


13

Це термінологічне / семантичне питання. Це може бути суб’єктивним, хоча існує базове визначення.

Я виглядаю так:

Будь-яка система управління / розгортання конфігурації має:

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

Відповідно:

  1. source data- це різні місця, куди ми можемо помістити дані - group_vars, playbookvars, rolevars і т. д., Ці місця впливають на пріоритет (якщо змінна з іменем однаково перевизначена в різних місцях, існують дуже конкретні правила щодо значення значення змінна під час ansible/ ansible-playbookвиконання
  2. target data - це інвентаризація (І, також можна визначити змінні інвентаризації / групи хостів всередині інвентаризації!)
  3. config changes - ansible має 4 рівні абстракції:
    1. завдання - одна дія
    2. список завдань - список дій
    3. role - список дій (або список списків), згрупованих за одним і тим же "предметом", зазвичай всі цілі працюють на одному хості / групі хостів
    4. playbook - список відтворень, кожна з яких працює на, можливо, різній хост-групі, застосовуючи кілька roles / tasks / списків завдань (і спеціальних завдань, таких як handlers)

З "програмного" аспекту - роль повинна бути достатньо загальною для повторного використання .

Також у деяких (досить великих) організаціях `` ролі '' передаються групою A, тоді як вони використовуються в ігрових книгах, що ведуться групою B.

резюме

Все вищесказане дозволяє групувати подібні конфігурації - в a role. групування пов'язаних підсистем / компонентів в одну playbook. Крім того , варто згадати, 1 YAML пункт в збірник п'єс ( у тому числі hosts:і один або tasks, pre_tasks, post_tasks, roles) називаєтьсяplay

Тепер до вашого запитання:

Так, спочатку це бентежить.

Зазвичай ви підключаєте свої source dataдані до семантики своєї ролі, тому, коли бачите, що ця роль setup_dbзастосовується у відтворенні до пов’язаної групи хостів (наприклад db_hosts), але a playможе працювати над об’єднанням декількох груп хостів. Це лише питання умовності проти гнучкості.

PS

Будь ласка, напишіть мені, додало це плутанини чи пояснило. Дякую.


1

Також майте на увазі, що книжка ігор може викликати більше однієї ролі, якщо використовується мета-файл, який призначений впливати на різні ролі.

Приклад 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

0

Простіше кажучи:

Книга ігор подібна до основної програми, вона містить повні інструкції щодо завершення роботи. Однак для великих проектів не бажано насправді вкладати в них кожну деталь. Тож вам потрібна роль.

Роль є підпрограмою і зазвичай досягає однієї мети, наприклад, налаштування сервера баз даних. Ви можете помістити його в roles/каталог або завантажити сторонні ролі, надавши URI rolesfile.ymlі попросити ansible-galaxy завантажити їх для вас.

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

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

Згрупуйте webабо databaseпотім можна використовувати в ігрових книгах або ролях, щоб вказати хостів, яких потрібно застосувати.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.