Решение для обхода бага, который описан тут и тут и еще мой. Что интересно, в моем багрепорте сказано о неверном сопоставлении любого compound matchers, т.е. нодгруппа правильно определяется только в случае перечисления всех нод в этой группе и не работают при любом виде подстановок или регулярок. Это плохо, но суть заметки сводится немного к другому: любое работающее определение нодгрупп, которое нормально обрабатывается солтом в консоли, некорректно сопоставляется в Jinja шаблонах.
Описание проблемы
Допустим, есть три окружения, сервера которых объединены в три нодгруппы - dev
, stg
и prd
, где значение key для каждого окружения должно быть разным. Вот как предлагает сделать документация, но так не работает. Пример неработающего jinja шаблона:
{% set dev = pillar.dev %} {% set stg = pillar.stg %} {% set prd = pillar.prd %} {% if grains.id in salt['pillar.get']('master:nodegroups:dev', []) %} "key":"{{ dev.value }}" {% elif grains.id in salt['pillar.get']('master:nodegroups:stg', []) %} "key":"{{ stg.value }}" {% elif grains.id in salt['pillar.get']('master:nodegroups:prd', []) %} "key":"{{ prd.value }}" {% endif %}
Решение
Для правильной подстановки переменной необходимо вынести в новую переменную id миньона из grains'ов {% set id = grains.get('id') %}
и читать ее в условии, т.е. бага заключается в том, что Salt не может взять grains.id в самом условии. Пример работающего jinja шаблона:
{% set dev = pillar.dev %} {% set stg = pillar.stg %} {% set prd = pillar.prd %} {% set id = grains.get('id') %} {% if id in salt['pillar.get']('master:nodegroups:dev', []) %} "key":"{{ dev.value }}" {% elif id in salt['pillar.get']('master:nodegroups:stg', []) %} "key":"{{ stg.value }}" {% elif id in salt['pillar.get']('master:nodegroups:prd', []) %} "key":"{{ prd.value }}" {% endif %}
На всякий случай приведу pillar:
dev: - value: ValueForDevelopment stg: - value: ValueForStaging prd: - value: ValueForProduction
Решение найдено в последнем комменте