Returners 返回器


Returner

minion端将数据返回给salt master,但是我们可以使用salt Returner将返回的数据重定向到
其他外部组件上,便于以后的分析和归档。

所有内置的Returner支持列表参看链接:http://docs.saltstack.cn/ref/returners/index.html,里面有详细的使用方法


USING RETURNERS

可以指定一个returners提供数据接收
salt '*' test.ping --return redis_return

也可以指定多个returners接收器
salt '*' test.ping --return mongo_return,redis_return,cassandra_return


WRITING A RETURNER

一个redis的例子:

 1 import redis
 2 import json
 3 
 4 def returner(ret):
 5     '''
 6     Return information to a redis server
 7     '''
 8     # Get a redis connection
 9     serv = redis.Redis(
10                 host='redis-serv.example.com',
11                 port=6379,
12                 db='0')
13     serv.sadd("%(id)s:jobs" % ret, ret['jid'])
14     serv.set("%(jid)s:%(id)s" % ret, json.dumps(ret['return']))
15     serv.sadd('jobs', ret['jid'])
16     serv.sadd(ret['jid'], ret['id'])
View Code

minion端返回的数据格式可使用如下命令获取:

salt-call --local --metadata test.ping --out=pprint

如何写一个returners,介绍一个job cache需要具备的哪些功能要求

一个MASTER JOB CACHE SUPPORT需要提供的基本功能
prep_jid
提供jid的唯一性
示例代码:

1 def prep_jid(nocache, passed_jid=None):  # pylint: disable=unused-argument
2     '''
3     Do any work necessary to prepare a JID, including sending a custom id
4     '''
5     return passed_jid if passed_jid is not None else salt.utils.jid.gen_jid()
View Code

save_load
保存job的内容,并进行序列化存放在salt.jids表中
示例代码:

 1 def save_load(jid, load):
 2     '''
 3     Save the load to the specified jid id
 4     '''
 5     query = '''INSERT INTO salt.jids (
 6                  jid, load
 7                ) VALUES (
 8                  '{0}', '{1}'
 9                );'''.format(jid, json.dumps(load))
10 
11     # cassandra_cql.cql_query may raise a CommandExecutionError
12     try:
13         __salt__['cassandra_cql.cql_query'](query)
14     except CommandExecutionError:
15         log.critical('Could not save load in jids table.')
16         raise
17     except Exception as e:
18         log.critical('''Unexpected error while inserting into
19          jids: {0}'''.format(str(e)))
20         raise
View Code

get_load
接收一个jid参数,返回存储在save_load里面的内容
示例代码:

 1 def get_load(jid):
 2     '''
 3     Return the load data that marks a specified jid
 4     '''
 5     query = '''SELECT load FROM salt.jids WHERE jid = '{0}';'''.format(jid)
 6 
 7     ret = {}
 8 
 9     # cassandra_cql.cql_query may raise a CommandExecutionError
10     try:
11         data = __salt__['cassandra_cql.cql_query'](query)
12         if data:
13             load = data[0].get('load')
14             if load:
15                 ret = json.loads(load)
16     except CommandExecutionError:
17         log.critical('Could not get load from jids table.')
18         raise
19     except Exception as e:
20         log.critical('''Unexpected error while getting load from
21          jids: {0}'''.format(str(e)))
22         raise
23 
24     return ret
View Code

一个EXTERNAL JOB CACHE SUPPORT需要提供除master的那些功能以外还需要提供额外的一些功能

get_jid
根据任务ID返回一个字典类型的job内容

 1 {
 2     "local": {
 3         "master_minion": {
 4             "fun_args": [],
 5             "jid": "20150330121011408195",
 6             "return": true,
 7             "retcode": 0,
 8             "success": true,
 9             "cmd": "_return",
10             "_stamp": "2015-03-30T12:10:12.708663",
11             "fun": "test.ping",
12             "id": "master_minion"
13         }
14     }
15 }
View Code

get_fun
返回一组minion和对应执行的函数

1 {
2     "local": {
3         "minion1": "test.ping",
4         "minion3": "test.ping",
5         "minion2": "test.ping"
6     }
7 }
View Code

get_jids
返回job id的列表

1 {
2     "local": [
3         "20150330121011408195",
4         "20150330195922139916"
5     ]
6 }
View Code

get_minions
返回minion列表

1 {
2      "local": [
3          "minion3",
4          "minion2",
5          "minion1",
6          "master_minion"
7      ]
8 }
View Code

EVENT SUPPORT

支持时间返回,但是需要在master中打开相关的配置
event_return
event_return_queue

支持自定义event_return,默认的返回示例如下:

 1 def event_return(events):
 2  '''
 3  Return event to mysql server
 4 
 5  Requires that configuration be enabled via 'event_return'
 6  option in master config.
 7  '''
 8  with _get_serv(events, commit=True) as cur:
 9      for event in events:
10          tag = event.get('tag', '')
11          data = event.get('data', '')
12          sql = '''INSERT INTO `salt_events` (`tag`, `data`, `master_id` )
13                   VALUES (%s, %s, %s)'''
14          cur.execute(sql, (tag, json.dumps(data), __opts__['id']))
View Code

CUSTOM RETURNERS

在file_roots环境里面定义一个_returners目录,使用方法salt://_returners,解释查看:http://docs.saltstack.cn/ref/modules/all/salt.modules.saltutil.html#salt.modules.saltutil.sync_returners里面的释义


NAMING THE RETURNER

returners的命名问题,__virtual__ 函数可以用来重写该命名,例如redis_return.py在加载的时候就变成了redis
示例代码如下:

 1 try:
 2     import redis
 3     HAS_REDIS = True
 4 except ImportError:
 5     HAS_REDIS = False
 6 
 7 __virtualname__ = 'redis'
 8 
 9 def __virtual__():
10     if not HAS_REDIS:
11         return False
12     return __virtualname__
View Code

TESTING THE RETURNER


测试自己写的returner,可以在minion上通过salt-call测试自己编写的扩展存储组件的基本功能
示例方法如下:

1 salt-call ret.get_jids cassandra_cql --output=json
2 salt-call ret.get_fun cassandra_cql test.ping --output=json
3 salt-call ret.get_minions cassandra_cql --output=json
4 salt-call ret.get_jid cassandra_cql 20150330121011408195 --output=json
View Code

EVENT RETURNERS

可以记录salt master上的所有时间信息,注意主机的性能问题,因为大量的minion会给master带来较大的压力

 思考:

  (1)为什么extend job cache需要比master端支持更多的功能

      可能是由于在master进行数据收集重定向的时候,master端已经将数据进行过整理,而在minion端收集返回数据则类似一个分布式的信息上传机制,功能需求相应的会复

      杂一些。

原文地址:https://www.cnblogs.com/solitarywares/p/7446344.html