При создании новой роли Ansible шаблон создает каталог a vars
и defaults
каталог с пустым main.yml
файлом. При определении моей роли я могу поместить определения переменных в любое из них, и они будут доступны в моих задачах.
Какая разница между введением определений в defaults
и vars
? Во что следует вникнуть defaults
, а во что vars
? Имеет ли смысл использовать оба для одних и тех же данных?
Я знаю, что есть различие в приоритете / приоритете между ними, но я хотел бы понять, что и куда должно идти.
Допустим, моя роль создаст список каталогов в целевой системе. Я хотел бы предоставить список каталогов по умолчанию для создания, но хотел бы позволить пользователю переопределить их при использовании роли.
Вот как это будет выглядеть:
---
- directories:
- foo
- bar
- baz
Я мог бы поместить это или в defaults/main.yml
или в vars/main.yml
, с точки зрения выполнения, это не будет иметь никакого значения - но куда это должно пойти?
defaults
а чтоvars
дальше.Ролевые переменные, определенные в,
var
имеют очень высокий приоритет - они могут быть перезаписаны только путем передачи их в командной строке, в конкретной задаче или в блоке. Поэтому почти все ваши переменные должны быть определены вdefaults
.В статье « Приоритет переменной - где поставить свои ролевые переменные » автор приводит один пример того, что нужно добавить
vars
: специфичные для системы константы, которые мало меняются. Таким образом, вы можете иметьvars/debian.yml
иvars/centos.yml
с одинаковыми именами переменных, но с разными значениями и включать их условно.источник
ИМХО это непрактично и не имеет смысла , что анзибль таких мест высокого приоритета по конфигурации в Варсе из ролей . Конфигурация в
vars/main.yml
иdefaults/main.yml
должна быть низкой и, вероятно, того же приоритета.Есть ли в реальной жизни примеры случаев, когда мы хотим такого поведения?
Есть примеры, которые мы не хотим этого.
Смысл здесь в том, что конфигурация
defaults/main.yml
не может быть динамической. Конфигурация вvars/main.yml
банке. Так, например, вы можете динамически включить конфигурацию для конкретной ОС и версии, как показано в geerlingguy.postgresqlНо поскольку приоритетность в Ansible настолько странна и непрактична, geerlingguy необходимо ввести псевдопеременные, как это можно увидеть в variables.yml
Это конкретный пример из реальной жизни, демонстрирующий непрактичность приоритета.
Еще один момент, на который стоит обратить внимание: мы хотим, чтобы роли можно было настраивать. Роли могут быть внешними, управляемыми кем-то другим. Как правило, вы не хотите, чтобы конфигурация в ролях имела высокий приоритет.
источник
По сути, все, что входит в «значения по умолчанию для роли» (папка по умолчанию внутри роли), является наиболее гибким и легко перезаписывается. Все, что находится в каталоге vars роли, переопределяет предыдущие версии этой переменной в пространстве имен. Идея состоит в том, что чем более явно вы видите область действия, тем больше преимуществ у командной строки -e всегда выигрывают дополнительные переменные. Переменные хоста и / или инвентаря могут преобладать над значениями по умолчанию, но не включают явные включения, такие как каталог vars или задача include_vars. доктор
источник
Переменные и значения по умолчанию идут рука об руку. вот пример
в вашем файле по умолчанию вы будете иметь что-то вроде:
То, что будет делать ANSIBLE, будет принимать значение
package_version
и помещать его рядом с именем пакета, чтобы оно читалось где-то как:Таким образом, он будет установлен,
xyz123
а неxyz123.4
или что-либо еще в большом хранилище XYZ.В конце это будет делать
yum install -y xyz123
Таким образом, в основном значения по умолчанию являются существующими значениями, если вы не установите конкретное значение для переменных, потому что пространство не может оставаться пустым.
источник
defaults
, используются, когда нетvars
определенного, но ответ не объясняет, почему вы бы определили значение как одно или другое, что и было задано ОП. Сравните с объяснением ниже.