Назад | Перейти на главную страницу

Есть ли более идиоматический способ переключить состояние Salt в зависимости от ОС хоста?

В верхней части моего файла состояния у меня есть:

{% if grains['os'] == 'Ubuntu' %}
  {% set ubuntu = True %}
  {% set arch = False %}
{% elif grains['os'] == 'Arch' %}
  {% set ubuntu = False %}
  {% set arch = True %}
{% endif %}

Позже,

{% if ubuntu %}
cron:
{% elif arch %}
cronie:
{% endif %}
  pkg.installed
  service.running:
    - enable: True

Но это не работает; мои условные выражения ничего не отображают (пустые строки). Мне это неприятно, даже если небольшой рефакторинг поможет.

Есть ли более идиоматический способ чередовать мелкие детали, подобные этой, с помощью Salt без такого большого количества шаблонов шаблонов?

Это не работает, вероятно, потому что pkg.installed должен быть список, даже без параметров:

pkg.installed: []

Это должно работать:

{% if ubuntu %}
cron:
{% elif arch %}
cronie:
{% endif %}
  pkg.installed: []
  service.running:
    - enable: True

Или более разумным способом:

{% set cron = salt['grains.filter_by']({
    'Ubuntu': 'cron',
    'Arch':   'cronie',
    }, grain='os') %}

{{cron}}:
  pkg.installed: []
  service.running:
    - enable: True

Или, может быть, имя службы отличается от имени пакета:

{% set cron = salt['grains.filter_by']({
    'Ubuntu': {
        'package': 'cron',
        'service': 'crond',
        },
    'Arch': {
        'package': 'cronie',
        'service': 'cronie',
        },
    }, grain='os') %}

{{cron['package']}}:
  pkg.installed: []
  service.running:
    - name:   {{cron['service']}}
    - enable: True

grains.filter_by задокументировано в http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.grains.html#salt.modules.grains.filter_by

Для чего-то более сложного взгляните на https://github.com/saltstack-formulas/apache-formula/blob/master/apache/map.jinja