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'])
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()
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
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
一个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 }
get_fun
返回一组minion和对应执行的函数
1 { 2 "local": { 3 "minion1": "test.ping", 4 "minion3": "test.ping", 5 "minion2": "test.ping" 6 } 7 }
get_jids
返回job id的列表
1 { 2 "local": [ 3 "20150330121011408195", 4 "20150330195922139916" 5 ] 6 }
get_minions
返回minion列表
1 { 2 "local": [ 3 "minion3", 4 "minion2", 5 "minion1", 6 "master_minion" 7 ] 8 }
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']))
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__
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
EVENT RETURNERS
可以记录salt master上的所有时间信息,注意主机的性能问题,因为大量的minion会给master带来较大的压力
思考:
(1)为什么extend job cache需要比master端支持更多的功能
可能是由于在master进行数据收集重定向的时候,master端已经将数据进行过整理,而在minion端收集返回数据则类似一个分布式的信息上传机制,功能需求相应的会复
杂一些。