В зависимости от значения (True / False) переменной, определенной в group_vars, я пытаюсь определить некоторые переменные в файле vars. Их значение зависит от значения группы var.
Мой текущий файл var выглядит так:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Для каждой из моих ролей я использую переменную, определенную в этом файле.
Моя тестовая книга выглядит следующим образом:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
Ошибка, которую я получаю после запуска playbook:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
Я делаю что-то глупое здесь или это даже не поддерживается? Я пытался найти другой способ определения этих переменных (у меня их много), но мне не удалось получить что-то функциональное здесь. Какие-либо предложения?
ansible
automation
jinja
pandoJohn
источник
источник
template
вызова модуля.test
это зависит от группы, он должен быть помещен в group_vars.Ответы:
Я не думаю, что вы можете, я обычно создаю отдельные файлы для хранения коллекций условных переменных и использую
when
предложение, чтобы включить их в определенное условие:источник
Ansible позволяет одной из следующих форм определять переменную условно:
Комбинируя приведенный выше синтаксис с поиском vars, мы можем загружать сложные vars (список в этом случае):
Есть другой способ сделать условную загрузку дерева с помощью поиска vars. Этот способ удобен, когда вам нужно реализовать логику регистра (то есть переменная условия имеет более двух возможных значений):
источник
Несмотря на то, что это было бы хорошо, я боюсь, что ваш путь невозможен (или я не знаю правильный путь).
Я бы предложил сначала подготовить файл vars из шаблона jinja, а затем включить его с помощью include_vars. Смотрите пример playbook:
Содержимое примера шаблона jinja /tmp/vars.yaml.j2:
источник
- debug: var=test
я увидел, что там определеныtest.var1
иtest.var2
ожидаемые значения. Таким образом, вы должны быть в состоянии использовать эти переменные в других задачах сборника.AFAIK, это {}, что вы пытаетесь для шаблонов Jinja2, а не для файлов YML. Из документации :
Вы можете подготовить отдельный файл .yml для игры, в которой задаются переменные, которые вам нужны при использовании предложений when, и затем импортировать (или включать) их в основную книгу. Таким образом, вы можете условно определить все переменные в одном файле.
ИЛИ: используйте роли. Я думаю, что роли являются наиболее адекватным подходом для решения вашей проблемы.
источник
В итоге я создал 2 отдельных файла var - давайте назовем их
type_a.yml
иtype_b.yml
- и я определил переменную группы, которая указывает, какой файл использовать - что-то вродеtype_of_file: a
. Вот так выглядит моя книга игр:Спасибо за ответы на все вопросы. Я считаю их действительно полезными.
источник
Я надеюсь, что следующий фрагмент (взятый из Ansible Documentation ) может стать полезным дополнением к полезным вкладам других выше.
источник