Переменные и фильтры
Тема дорожной карты · 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-модуле.
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…