В чем разница между значениями по умолчанию и 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

таким образом, в основном по умолчанию присутствуют значения, если вы не задаете определенное значение для переменных, потому что пространство не может оставаться пустым.