我在一个使用grain.filter_by的状态下使用map.jinja文件,匹配谷物w / id'角色'。这用于动态设置应用程序使用的Java版本。我知道,很奇怪,但这就是我继承的系统今天如何工作,所以我在配置管理中将其设置为第1步,以使事情变得更好。地图文件在主机上没有任何问题,谷物值'role'是单个项目(我认为是yaml中的列表)。
地图文件示例:
{% set java = salt['grains.filter_by']({
'default': {
'link_target': '/path/jdk1.7.0_03',
},
'appA': {
'link_target': '/path/jdk1.7.0_75',
},
'appB': {
'link_target': '/path/jdk1.6.0_06',
},
},
grain='role',
default='default'
)%}
主机的粒度值w /角色值字典,我在这些主机上得到错误:
role:
----------
appA:
None
appC:
None
appD:
----------
someBool:
True
someVendor:
microsoft
someBool2:
False
someVendor2:
apple
type:
delayed
没有谷物字典的主机的谷物值,没有错误:
role:
appB
错误:
Data failed to compile:
----------
Rendering SLS 'base:java' failed: Jinja error: unhashable type: 'dict'
/var/cache/salt/minion/files/base/java/map.jinja(1):
---
{% set java = salt['grains.filter_by']({ <======================
现在,我很确定这是因为我的角色值字典的粒度值与我的粒度值解析为yaml不同,粒度值是一个简单的键:值对。
我是SaltStack和YAML的新手,所以我在这里可能会遗漏一些小事。我的粮食价值太复杂了吗?你有更好的方法来修复或推荐吗?
答案 0 :(得分:1)
也许您应该再次查看salt.modules.grains的文档。
所以这就是我所看到的:
salt.modules.grains.filter_by(lookup_dict, grain='os_family', merge=None, default='default', base=None)
lookup_dict - 由谷物键入的字典,包含值或 与匹配该谷物的系统相关的值。例如,一把钥匙 可能是操作系统的粒度,值可能是包的名称 在那个特定的操作系统上。
字典值键似乎必须是一粒。