Содержание
Ограничения в именах сценариев:
- в именах sls нельзя использовать точку. Точка используется для смены директорий. Поэтому some.state.sls SaltStack расшифрует как some/state.sls и ссылка include: [some.state] не сработает. Так же не рекомендуется использовать файлы .hidefile без маскировки. Перееименуем в dot_hidefile.
 
Объединение нескольких однородных операций:
Пример для файлов:
Base files:
  file.managed:
    - Template: Jinja
    - names:
      - /etc/salt/minion:
        - source: salt://{{ slspath }}/files/minion.jinja
      - /etc/salt/master:
        - source: salt://{{ slspath }}/files/master.jinja
        - mode: 0640
slspath — ссылка на текущее расположение sls. Полезно: можно задать общие параметры и специфические для каждого файла.
Пример для установки программ:
Some programs:
  - pkg.installed:
    - pkgs:
      - vim
      - htop
      - dnsutils
Может использоваться как нотация pkgs так и names. Работает одинаково.
Импорт сценариев:
Вариант нотации YAML:
<client/servers/serv1.sls>
import:
  - .app
  - formula/db
  - ..client_base
При импорте можно использовать относительную и абсолютную нотацию. Точка будет обозначать текущий каталог sls, две точки — отбросит на каталог вверх, три точки на — два каталога и т.д. При указании стейта без точек — будет искать с корня file_root. При обработке на миньоне импортированные sls покажет как дополнительные стейты. Т.е. пример выше выведет:
salt serv1 state.show_states serv1: - clients.servers.serv1 - clients.servers.app - clients.client_base - formula.db
Вариант Jinja:
{% include 'spam/foobar.jinja' %}
При этом надо учитывать, что для SaltStack это будет учитываться как SLS в который импортируют. Все переменные типа slspath и sls будут возвращать ссылки на стейт в который импортировали код. При обработке сценариев покажет как один стейт.
Работа с GRAINS:
В сценариях можно использовать несколько вариантов обращения к grains:
Нотация с точкой:
{% if grains.os == "Debian" %}
Удобно читать, но надо учитывать несколько моментов:
- этот тип grains должен существовать, иначе выпадет в ошибку
 - имя grains не должно пересекаться со служебными именами функций… get и items мы так не получим.
 
Нотация как с массивом:
{% if grains["kernel"] != "FreeBSD" %}
Не пересекается с зарезервированными имена, но должна существовать.
Получение через метод GET:
{% if "app" in salt['grains.get']('roles',[]) %}
Плюс метода — позволяет задать значение по-умолчанию при несуществующем grains. В данном примере — пустой массив.