Используя данные зерна в пользовательском зерне стека соли

Я хотел бы написать, что фактически является "виртуальным зерном", которое определяет какое-то значение на основе значения других зерен, используя пользовательское зерно. В частности, я хочу предоставить значения зерна env, которые сообщают мне, в какой виртуальной среде работает хост. Варианты будут aws или ни один из них в настоящее время, но в будущем будут включать центр обработки данных и офис. Я буду использовать эту информацию для определения настроек, например, какой SMTP-ретранслятор использовать и т. Д.

Моя первая попытка состояла в том, чтобы использовать диктат __grains__, но, по-видимому, он пуст при обращении к пользовательскому фрагменту.

def find_env():
    if __grains__['os'] == 'Amazon':
        return {'env':['aws']}
    return {'env': []}

это приводит к исключению:

KeyError: 'os'

Я понимаю, что мог бы статически назначать зерна на миньоне или в командной строке, но я чувствую, что любой бит информации, который может быть получен автоматически, должен быть.

Есть ли способ доступа к существующим данным зерна при записи пользовательских зерен или другой способ автоматической классификации хостов, чтобы я мог настроить для них состояние?

1 ответ

Решение

Я бы предложил использовать состояния, чтобы назначить значения зерна в зависимости от ситуации. Например, что-то вроде:

top.sls

base:
  'kernel:Linux':
    - match: grain
    - linux

linux.sls

env:
  grains.present:
    {% if grains ['os'] == 'Amazon' %}
    - value: aws
    {% else %}
    - value: somethingelse
    {% endif %}

Есть другие более чистые способы сделать это, но это должно помочь вам.

Другие вопросы по тегам