在自定义盐栈中使用grain数据

在自定义盐栈中使用grain数据

我想编写一个有效的“虚拟grain”,使用自定义grain根据其他grain的值确定一些值。具体来说,我想提供一个grain值,env,告诉我主机在哪个虚拟环境中运行。选项将是aws,或当前为none,但将来将包括数据中心和办公室。我将使用此信息来确定配置,例如要使用哪个SMTP中继等。

我的第一次尝试是使用__grains__字典,但是在自定义grains中访问时它似乎是空的。

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

这会导致异常:

KeyError: 'os'

我意识到我可以在 minion 或命令行上静态分配粒度,但我觉得任何可以自动获取的信息都应该如此。

有没有办法在编写自定义grain时访问现有的grain数据,或者有另一种方法可以自动对主机进行分类,以便我可以将状态定位到它们?

答案1

我建议使用状态分配适当的粒度值。例如:

顶部.sls

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

linux.sls

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

还有其他更简洁的方法可以做到这一点,但这应该可以让你开始。

相关内容