SaltStack - map.jinja 文件无法匹配字典类型的粒度,我是否错误地定义了粒度?
SaltStack - map.jinja file cannot match on grain of type dictionary, am I defining grains incorrectly?
我正在使用 map.jinja 文件,该文件处于使用 grains.filter_by 的状态,匹配带有 ID 'role' 的颗粒。这用于动态设置应用程序使用的 Java 版本。我知道,这很奇怪,但这就是我今天继承的系统的工作方式,所以我在配置管理中将其设置为第 1 步,以使事情变得更好。地图文件在主机上完全没有问题,grain 值 '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'
)%}
带有角色值字典的主机的粒度值,我在这些主机上收到错误:
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']({ <======================
现在,我很确定这是因为我的 grain 值和角色值字典解析成 yaml 的方式不同于我的 grain 值,后者是一个简单的 key:value 对。
我是 SaltStack 和 YAML 的新手,所以我可能在这里遗漏了一些微不足道的东西。我的谷物价值是否变得太复杂了?您是否有更好的解决方法或建议?
也许你应该再次查看salt.modules.grains的文档。
这就是我看到的:
salt.modules.grains.filter_by(lookup_dict, grain='os_family', merge=None, default='default', base=None)
lookup_dict -- A dictionary, keyed by a grain, containing a value or
values relevant to systems matching that grain. For example, a key
could be the grain for an OS and the value could the name of a package
on that particular OS.
看来字典值键一定是grain。
我正在使用 map.jinja 文件,该文件处于使用 grains.filter_by 的状态,匹配带有 ID 'role' 的颗粒。这用于动态设置应用程序使用的 Java 版本。我知道,这很奇怪,但这就是我今天继承的系统的工作方式,所以我在配置管理中将其设置为第 1 步,以使事情变得更好。地图文件在主机上完全没有问题,grain 值 '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'
)%}
带有角色值字典的主机的粒度值,我在这些主机上收到错误:
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']({ <======================
现在,我很确定这是因为我的 grain 值和角色值字典解析成 yaml 的方式不同于我的 grain 值,后者是一个简单的 key:value 对。
我是 SaltStack 和 YAML 的新手,所以我可能在这里遗漏了一些微不足道的东西。我的谷物价值是否变得太复杂了?您是否有更好的解决方法或建议?
也许你应该再次查看salt.modules.grains的文档。
这就是我看到的:
salt.modules.grains.filter_by(lookup_dict, grain='os_family', merge=None, default='default', base=None)
lookup_dict -- A dictionary, keyed by a grain, containing a value or values relevant to systems matching that grain. For example, a key could be the grain for an OS and the value could the name of a package on that particular OS.
看来字典值键一定是grain。