Jinja в SLS
Тема дорожной карты · SaltStack
SLS-файл — это шаблон, который преобразуется в YAML после рендеринга. Понимание двухступенчатого процесса — сначала Jinja, затем YAML — отличает уверенную работу с состояниями от борьбы с ошибками парсера. Jinja в SLS позволяет описывать поведение для разных ОС одним файлом, генерировать множество состояний циклом и подтягивать параметры из pillar без размножения файлов. Jinja оперирует текстом, не проверяя YAML-структуру, и честно склеивает результат, который затем проверяет YAML-парсер.
Как это работает
Первая строка SLS может задавать рендерер явно шебангом — #!jinja|yaml, но обычно это значение по умолчанию. Миньон получает файл, выполняет все Jinja-конструкции и передаёт результат YAML-парсеру. Пример выбора имени пакета по grains:
{% if grains['os_family'] == 'Debian' %}
{% set pkg = 'apache2' %}
{% else %}
{% set pkg = 'httpd' %}
{% endif %}
веб-сервер:
pkg.installed:
- name: {{ pkg }}
Цикл генерирует несколько состояний из одного блока — каждая итерация должна давать уникальный ID:
{% for user in salt['pillar.get']('app_users', []) %}
{{ user }}_account:
user.present:
- name: {{ user }}
{% endfor %}
Диагностика двухступенчатая: salt-call --local slsutil.renderer /srv/salt/app/init.sls показывает текст после Jinja, salt 'web*' state.show_sls app — структуру после YAML, state.apply app test=True — что реально изменится.
Когда применять
Jinja в SLS оправдана, когда без неё пришлось бы копировать файлы: одна формула на несколько дистрибутивов, состояния из списков в pillar (пользователи, виртуальные хосты, cron-задачи), включение и выключение блоков по окружению. Хорошая практика — держать логику наверху файла: собрать все {% set %} и вычисления в первых строках, а ниже оставить почти чистый YAML с подстановками {{ }}. Так файл остаётся читаемым, а диффы — осмысленными. Когда условной логики становится больше, чем самих состояний, пора выносить данные в map.jinja или разбивать формулу на отдельные SLS-файлы с включением через top.sls.
Типичные ошибки
Классика — отступы внутри циклов и условий: Jinja-теги стоят с отступом «для красоты», лишние пробелы попадают в результат, и YAML падает. Держите {% %}-теги в начале строки или управляйте пробелами через {%- и -%}. Вторая ошибка — неуникальные ID состояний в цикле: две итерации дают одинаковый ключ, и YAML молча перезапишет первый блок вторым либо Salt откажется применять дубль. Третья — правка SLS без прогона state.show_sls: ошибка рендеринга одного файла валит весь highstate на миньоне. И не прячьте в Jinja обращения к внешним системам — рендеринг должен быть быстрым и детерминированным.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- result /rɪˈzʌlt/ ударение на второй слог разбор: Behavioral questions и метод STAR
- tutorial /tjuːˈtɔːriəl/ «тьютОриэл» разбор: Читаем документацию, RFC и changelog
- should /ʃʊd/ l немая разбор: Язык RFC: MUST, SHOULD, MAY (RFC 2119)