我想编写一个有效的“虚拟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 %}
还有其他更简洁的方法可以做到这一点,但这应该可以让你开始。