SaltStack. Использование Nodegroups в Jinja шаблонах

Автор: Admin | 23.08.2017

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

Решение найдено в последнем комменте

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *