Переменные и фильтры

Тема дорожной карты · SaltStack

Переменные и фильтры — основные инструменты работы с Jinja в Salt. Переменные объявляются с помощью {% set %} и подставляются через {{ }}. Фильтры — функции-преобразователи, которые применяются к значению через вертикальную черту: {{ grains['os'] | lower }}. В SLS-шаблонах доступны стандартные фильтры Jinja (default, lower, join, replace) и дополнительные фильтры, добавленные Salt, такие как сериализация в YAML/JSON, работа с регулярными выражениями и путями. Главные источники данных для переменных — grains (факты о миньоне), pillar (данные, назначенные мастером) и вызовы execution-модулей через объект salt. Умение аккуратно доставать значения с дефолтами отличает шаблон, который переживает нестандартный миньон, от шаблона, который роняет рендеринг.

Как это работает

Локальная переменная задаётся так: {% set port = 8080 %} или из данных: {% set osfam = grains['os_family'] %}. К grains надёжнее обращаться через salt['grains.get']('key', 'default'), к pillar — через salt['pillar.get']('nginx:port', 80): двоеточие в ключе означает путь по вложенному словарю, а второй аргумент вернётся, если ключа нет. Прямое {{ pillar['nginx']['port'] }} при отсутствии ключа бросает исключение и валит рендеринг всего файла. Фильтры сцепляются в конвейер: {{ users | join(', ') }}, {{ value | default('none') }}, {{ name | replace('-', '_') }}. Salt добавляет свои фильтры: {{ data | yaml }} и {{ data | json }} сериализуют структуру (удобно передавать словарь в конфиг целиком), {{ 'a,b,c' | regex_match('a.*') }} проверяет значение по регулярному выражению, {{ path | path_join('conf.d') }} склеивает пути. Загрузить структуру из строки можно фильтром load_yaml, а из файла — тегом {% import_yaml 'app/defaults.yaml' as defaults %}.

Когда применять

Фильтр default и pillar.get с дефолтами используются, когда данные могут отсутствовать: это делает формулу применимой на любом миньоне без обязательного pillar. Сериализация | yaml/| json применяется, когда нужно передать в шаблон конфига целую структуру (списки апстримов, словарь опций) без ручного форматирования: одна строка вместо вложенного цикла. import_yaml удобен, когда дефолтные значения формулы удобнее держать в отдельном YAML-файле, а не в Jinja-коде; на этом строится паттерн map.jinja. Строковые фильтры (lower, replace) полезны для нормализации: {{ grains['os'] | lower }} даёт единообразные ключи для словарей соответствий. Если преобразование не выражается парой фильтров, выносите его в кастомный модуль, а не стройте цепочку из шести звеньев.

Типичные ошибки

Первая ошибка — прямые обращения к вложенным ключам pillar без pillar.get: один миньон без нужного pillar — и весь SLS не рендерится. Вторая ошибка — путаница между строкой и структурой: {{ mydict }} вставит Python-подобное представление словаря с одинарными кавычками, которое YAML может прочитать не так, как ожидалось; для честной сериализации используйте | yaml или | json. Третья ошибка — забытые кавычки вокруг подставленных строк в YAML: значение {{ version }} вида 1.10 YAML прочитает как число 1.1. Четвёртая ошибка — «умные» цепочки фильтров, которые через полгода никто не может прочитать: логика сложнее двух-трёх преобразований должна жить в execution-модуле.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →