В чем разница между значениями по умолчанию и 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 в командной строке) всегда win
- затем появляются переменные соединения, определенные в инвентаре (ansible_ssh_user и т. д.)
- затем идет "большинство всего остального "(переключатели командной строки, vars в игре, включены Варс роль Варс, и т. д.)
- затем идут остальные переменные, определенные в инвентаре
- затем приходят факты, обнаруженные о системе
- затем "роли по умолчанию", которые являются наиболее" defaulty " и теряют приоритет для всего.
Итак, предположим, у вас есть роль "tomcat", которую вы используете для установки Tomcat на кучу веб-хостов, но вам нужны разные версии tomcat на нескольких хостах, нужно, чтобы он работал как различные пользователи в других случаях и т. д. The 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
таким образом, в основном по умолчанию присутствуют значения, если вы не задаете определенное значение для переменных, потому что пространство не может оставаться пустым.