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。