"""Read pillar data from a Redis backend=====================================.. versionadded:: 2014.7.0:depends: - redis Python module (on master)Salt Master Redis Configuration===============================The module shares the same base Redis connection variables as:py:mod:`salt.returners.redis_return`. These variables go in your masterconfig file.* ``redis.db`` - The Redis database to use. Defaults to ``0``.* ``redis.host`` - The Redis host to connect to. Defaults to ``'salt'``.* ``redis.port`` - The port that the Redis database is listening on. Defaults to ``6379``.* ``redis.password`` - The password for authenticating with Redis. Only required if you are using master auth. Defaults to ``None``.Configuring the Redis ext_pillar================================ .. code-block:: yaml ext_pillar: - redis: {function: key_value}"""importsalt.utils.json__virtualname__="redis"
[docs]def__virtual__():""" Only load if the redis module is in __salt__ """if"redis.get_key"in__salt__:return__virtualname__returnFalse
[docs]defext_pillar(minion_id,pillar,function,**kwargs):""" Grabs external pillar data based on configured function """iffunction.startswith("_")orfunctionnotinglobals():return{}# Call specified function to pull redis datareturnglobals()[function](minion_id,pillar,**kwargs)
[docs]defkey_value(minion_id,pillar,pillar_key="redis_pillar"):# pylint: disable=W0613""" Looks for key in redis matching minion_id, returns a structure based on the data type of the redis key. String for string type, dict for hash type and lists for lists, sets and sorted sets. pillar_key Pillar key to return data into """# Identify key type and process as needed based on that typekey_type=__salt__["redis.key_type"](minion_id)ifkey_type=="string":return{pillar_key:__salt__["redis.get_key"](minion_id)}elifkey_type=="hash":return{pillar_key:__salt__["redis.hgetall"](minion_id)}elifkey_type=="list":list_size=__salt__["redis.llen"](minion_id)ifnotlist_size:return{}return{pillar_key:__salt__["redis.lrange"](minion_id,0,list_size-1)}elifkey_type=="set":return{pillar_key:__salt__["redis.smembers"](minion_id)}elifkey_type=="zset":set_size=__salt__["redis.zcard"](minion_id)ifnotset_size:return{}return{pillar_key:__salt__["redis.zrange"](minion_id,0,set_size-1)}# Return nothing for unhandled typesreturn{}
[docs]defkey_json(minion_id,pillar,pillar_key=None):# pylint: disable=W0613""" Pulls a string from redis and deserializes it from json. Deserialized dictionary data loaded directly into top level if pillar_key is not set. pillar_key Pillar key to return data into """key_data=__salt__["redis.get_key"](minion_id)# Return nothing for non-existent keysifnotkey_data:return{}data=salt.utils.json.loads(key_data)# Return as requestedifisinstance(data,dict)andnotpillar_key:returndataelifnotpillar_key:return{"redis_pillar":data}else:return{pillar_key:data}