В чем разница между defaults и vars в роли Ansible?
при создании новой роли Ansible шаблон создает как vars и defaults каталог с пустым . При определении моей роли я могу разместить определения переменных в любом из них, и они будут доступны в моих задачах.
в чем разница между помещением определений в defaults и vars? Что должно войти в defaults, а что должно быть вvars? Имеет ли смысл использовать оба для одних и тех же данных?
Я знаю что есть разница в приоритете / приоритете между ними, но я хотел бы понять, что должно идти куда.
предположим, что моя роль создаст список каталогов в целевой системе. Я хотел бы предоставить список каталогов по умолчанию, которые будут созданы, но хотел бы позволить пользователю переопределить их при использовании роли.
вот как это выглядит:
---
- directories:
- foo
- bar
- baz
я мог бы поместить это либо в defaults/main.yml или в vars/main.yml, С точки зрения исполнения, это не имело бы никакого значения - но куда он должен идти?
3 ответов:
Ansible документация на переменной очередностью резюмирует этот niceley:
Если несколько переменных с одинаковым именем определяются в разных местах, они выигрывают в определенном порядке, который:
- extra vars (- e в командной строке) всегда выигрывает
- затем идут переменные соединения, определенные в инвентаре (ansible_ssh_user и т. д.)
- затем идет "почти все остальное" (переключатели командной строки, vars в игре, включены Варс роль Варс, и т. д.)
- затем идут остальные переменные, определенные в инвентаре
- затем приходят факты, обнаруженные о системе
- затем "ролевые дефолты", которые являются самыми" дефолтными " и теряют приоритет во всем.
Итак, предположим, что у вас есть роль "tomcat", которую вы используете для установки Tomcat на кучу веб-хостов, но вам нужны разные версии tomcat на нескольких хостах, нужно, чтобы она работала как различные пользователи в других случаях и т. д. Элемент
defaults/main.ymlфайл может выглядеть примерно так:tomcat_version: 7.0.56 tomcat_user: tomcatпоскольку это просто значения по умолчанию, это означает, что они будут использоваться, если эти переменные не определены где-либо еще для рассматриваемого хоста. Вы можете переопределить их через extra-vars, через факты в вашем файле инвентаризации и т. д. чтобы задать различные значения для этих переменных.
Edit: обратите внимание, что приведенный выше список предназначен для Ansible 1.х. В Анзибль 2.x список был расширен. Как всегда,Ansible Documentation предоставляет подробное описание переменной приоритет для 2.x.
переменные роли, определенные в
varимеют очень высокий приоритет - они могут только быть заменены передачей их в командной строке, в конкретной задаче или в блоке. Поэтому почти все переменные должны быть определены вdefaults.в статье "Переменный Приоритет - Куда Поставить Свою Роль Vars" автор приводит один пример того, что поставить в
vars: системные константы, которые не сильно меняются. Так что вы можете иметьvars/debian.ymlиvars/centos.ymlС те же имена переменных, но разные значения и включают их условно.
переменные и значения по умолчанию идут рука об руку. вот пример
-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таким образом, в основном значения по умолчанию являются присутствующими значениями, если вы не задаете конкретное значение для переменных, потому что это пространство не может оставаться пустым.
Comments