Яка різниця між типовими та змінними в ролі Ansible?


151

Створюючи нову роль Ansible, шаблон створює і a, varsі defaultsкаталог з порожнім main.ymlфайлом. Визначаючи свою роль, я можу розміщувати змінні визначення в будь-якому з них, і вони будуть доступні в моїх завданнях.

Яка різниця між введенням визначення defaultsта vars? У що слід входити defaults, а в що робити vars? Чи є сенс використовувати обидва для одних і тих же даних?

Я знаю, що різниця в пріоритеті / пріоритеті між ними, але я хотів би зрозуміти, що слід куди йти.

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

Ось як це виглядатиме:

---
- directories:
  - foo
  - bar
  - baz

Я міг би помістити це або в, defaults/main.ymlабо vars/main.ymlз точки зору виконання, це не має ніякого значення - але куди воно має піти?

Відповіді:


113

Документація у відповіді на змінну пріоритету підсумовує цей приклад:

Якщо в різних місцях визначено кілька однойменних змінних, вони виграють у певному порядку, а саме:

  • додаткові vars (-e в командному рядку) завжди виграють
  • потім надходять змінні з'єднання, визначені в інвентарі (ansible_ssh_user тощо)
  • тоді виходить "більшість всього іншого" (перемикачі командного рядка, зміни в грі, включені vars, vars role тощо)
  • потім надходить решта змінних, визначених в інвентарі
  • потім з'являються факти, виявлені про систему
  • то "рольові дефолти", які є найбільш "дефолтними" і втрачають пріоритет у всьому.

Отже, припустимо, у вас є роль "tomcat", яку ви використовуєте для встановлення Tomcat на купі веб-хостів, але вам потрібні різні версії tomcat на декількох хостах, вони потрібні для запуску як різні користувачі в інших випадках і т.д. defaults/main.ymlФайл може виглядати щось на зразок цього:

tomcat_version: 7.0.56
tomcat_user: tomcat

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

Редагувати: Зауважте, що вищезазначений список призначений для відповіді 1.x. У відповіді 2.x список було розширено. Як завжди, Відповідна Документація забезпечує детальний опис змінної пріоритетності для 2.x.


4
Дякую, це відмінна сторінка - ось що я шукав. Я розглядаю набагато детальніше про те, що вкласти defaultsі що varsдалі вниз.
nwinkler

42
Варто підкреслити: роль vars має зле високий пріоритет . на мій досвід вони вищі, ніж грати вар, що насправді дратує.
tedder42

Через 5 років, але ... я схильний дивитися на це так: за замовчуванням ролі - це речі, за якими я очікую, що користувач ролі десь переможе у своїх варіантах. Варіанти ролей, OTOH, дозволяють мені уникати жорсткого кодування інформації у завданні, але, ймовірно, будуть замінені лише для тестування та змінені виконавцем ролей. Наприклад, початкове ім'я користувача адміністратора буде за замовчуванням, але версії залежностей матимуть значення.
ntwrkguru

41

Змінні ролі, визначені у, varмають дуже високий пріоритет - їх можна перезаписати, лише передавши їх у командному рядку, у конкретній задачі чи в блоці. Тому майже всі ваші змінні повинні бути визначені в defaults.

У статті " Змінна прецедент - куди поставити свою роль " автор наводить один приклад того, що потрібно ввести vars: Константи, характерні для системи, які не сильно змінюються. Таким чином, ви можете мати vars/debian.ymlі vars/centos.ymlоднакові імена змінних, але різні значення, і включати їх умовно.


4

ІМХО це непрактично і не має сенсу , що анзібль таких місць високого пріоритету по конфігурації в Варса з ролей . Конфігурація вvars/main.yml і defaults/main.ymlповинна бути низькою і, ймовірно, однаковою.

Чи є приклади реального життя випадків, коли ми хочемо такого типу поведінки?

Є приклади, які ми не хочемо цього.

Сенс, який слід зробити тут, полягає в тому, що конфігурація в defaults/main.ymlне може бути динамічною. Конфігурація в vars/main.ymlбанку. Так, наприклад, ви можете динамічно включати конфігурацію для конкретної ОС та версії, як показано на geerlingguy.postgresql

Але оскільки пріоритет настільки дивний і непрактичний в Ansible geerlingguy потребує введення псевдо змінних, як це можна побачити у variables.yml

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

Це конкретний приклад із реального життя, який демонструє, що пріоритет недоцільний.

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


Це має бути коментар, а не відповідь.
ntwrkguru

3

В основному, все, що переходить у "роль за замовчуванням" (папка за замовчуванням всередині ролі), є найбільш податливою і легко змінюється. Все, що знаходиться в каталозі vars ролі, перекриває попередні версії цієї змінної в просторі імен. Тут слід випливати з того, що чим явніше ви отримуєте рамки, тим більше переваг має командний рядок -е додаткові виграші завжди виграють. Змінні хоста та / або інвентаризації можуть перемагати за замовчуванням ролі, але не явні включає, наприклад, каталог vars або завдання include_vars. док


-4

Змінні та параметри за замовчуванням йдуть рука об руку. ось приклад

-name: install package
 yum: name=xyz{{package_version}} state=present

у вашому файлі за замовчуванням у вас буде щось на кшталт:

package_version: 123

Що робитиме ansible - це він візьме значення package_versionта поставить його поруч із назвою пакета, щоб воно десь читалося як:

-name: install package
 yum: name=xyz123 state=present

Таким чином він буде встановлений, xyz123а не, xyz123.4або що б там не було у великому сховищі xyz.

Наприкінці це зробить yum install -y xyz123

Отже, в основному типовими є значення, які є присутніми, якщо ви не встановите конкретне значення для змінних, це означає, що простір не може залишатися порожнім.


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