user797963
user797963

Reputation: 3027

SaltStack - map.jinja file cannot match on grain of type dictionary, am I defining grains incorrectly?

I'm using a map.jinja file in a state that uses grains.filter_by, matching on a grain w/ id 'role'. This is used to dynamically set the version of Java that an application uses. I know, weird, but that's how the system I inherited works today, so I'm setting it up as such in configuration management as step 1 to making things better. The map file has no problems at all on hosts with the grain value 'role' being a single item (which I believe is a list in yaml).

Example of the map file:

{% 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'
)%}

Grain values for host w/ a dictionary of role values, I get the error on these hosts:

 role:
    ----------
    appA:
        None
    appC:
        None
    appD:
        ----------
        someBool:
            True
        someVendor:
            microsoft
        someBool2:
            False
        someVendor2:
            apple
        type:
            delayed

Grain values for hosts without a dictionary for grains, no error:

role:
    appB

Error:

    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']({    <======================

Now, I'm pretty sure this is because my grain value with a dictionary of role values parses into yaml differently than my grain values that are a simple key:value pair.

I'm new to SaltStack and YAML, so I'm likely missing something trivial here. Am I getting too complex with my grain values? Do you have a fix or recommendation on a better way to do this?

Upvotes: 0

Views: 1345

Answers (1)

mootmoot
mootmoot

Reputation: 13166

Perhaps you should check the documentation of salt.modules.grains again.

So this is what I see :

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.

It seems the dictionary value key must be a grain.

Upvotes: 1

Related Questions