В чем разница между defaults и vars в роли Ansible?



при создании новой роли Ansible шаблон создает как vars и defaults каталог с пустым . При определении моей роли я могу разместить определения переменных в любом из них, и они будут доступны в моих задачах.



в чем разница между помещением определений в defaults и vars? Что должно войти в defaults, а что должно быть вvars? Имеет ли смысл использовать оба для одних и тех же данных?



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



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



вот как это выглядит:



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


я мог бы поместить это либо в defaults/main.yml или в vars/main.yml, С точки зрения исполнения, это не имело бы никакого значения - но куда он должен идти?

965   3  

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

    Ничего не найдено.