
Решение для обхода бага, который описан тут и тут и еще мой. Что интересно, в моем багрепорте сказано о неверном сопоставлении любого 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
Решение найдено в последнем комменте