python 监听salt job状态,并任务数据推送到redis中的方法


Posted in Python onJanuary 14, 2019

salt分发后,主动将已完成的任务数据推送到redis中,使用redis的生产者模式,进行消息传送

#coding=utf-8
import fnmatch,json,logging
import salt.config
import salt.utils.event
from salt.utils.redis import RedisPool
import sys,os,datetime,random
import multiprocessing,threading
from joi.utils.gobsAPI import PostWeb
logger = logging.getLogger(__name__)
opts = salt.config.client_config('/data/salt/saltstack/etc/salt/master')
r_conn = RedisPool(opts.get('redis_db')).getConn()
lock = threading.Lock()
class RedisQueueDaemon(object):
	'''
	redis 队列监听器
	'''
	def __init__(self,r_conn):
		self.r_conn = r_conn #redis 连接实例
		self.task_queue = 'task:prod:queue' #任务消息队列
	def listen_task(self):
		'''
		监听主函数
		'''
		while True:
				queue_item = self.r_conn.blpop(self.task_queue,0)[1]
				print "queue get",queue_item
				#self.run_task(queue_item)
				t = threading.Thread(target=self.run_task,args=(queue_item,))
				t.start()
	def run_task(self,info):
		'''
		执行操作函数
		'''
		lock.acquire()
		info = json.loads(info)
		if info['type'] == 'pushTaskData':
			task_data = self.getTaskData(info['jid'])
			task_data = json.loads(task_data) if task_data else []
			logger.info('获取缓存数据:%s' % task_data)
			if task_data:
				if self.sendTaskData2bs(task_data):
					task_data = []
			self.setTaskData(info['jid'], task_data)
		elif info['type'] == 'setTaskState':
			self.setTaskState(info['jid'],info['state'],info['message'])
		elif info['type'] == 'setTaskData':
			self.setTaskData(info['jid'], info['data'])
		lock.release()
	def getTaskData(self,jid):
		return self.r_conn.hget('task:'+jid,'data')
	def setTaskData(self,jid,data):
		self.r_conn.hset('task:'+jid,'data',json.dumps(data))
	def sendTaskData2bs(self,task_data):
		logger.info('发送任务数据到后端...')
		logger.info(task_data)
		if task_data:
			p = PostWeb('/jgapi/verify',task_data,'pushFlowTaskData')
			result = p.postRes()
			print result
			if result['code']:
				logger.info('发送成功!')
				return True
			else:
				logger.error('发送失败!')
				return False
		else:
			return True
	def setTaskState(self,jid,state,message=''):
		logger.info('到后端设置任务【%s】状态' % str(jid))
		p = PostWeb('/jgapi/verify',{'code':jid,'state':'success','message':message},'setTaskState')
		result = p.postRes()
		if result['code']:
			logger.info('设置任务【%s】状态成功!' % str(jid))
			return True,result
		else:
			logger.error('设置任务【%s】状态失败!' % str(jid))
			return result		
def salt_job_listener():
	'''
	salt job 监听器
	'''
	sevent = salt.utils.event.get_event(
			'master',
			sock_dir=opts['sock_dir'],
			transport=opts['transport'],
			opts=opts)	
	while True:
		ret = sevent.get_event(full=True)
		if ret is None:
			continue
		if fnmatch.fnmatch(ret['tag'], 'salt/job/*/ret/*'):
			task_key = 'task:'+ret['data']['jid']
			task_state = r_conn.hget(task_key,'state')
			task_data = r_conn.hget(task_key,'data')
			if task_state:
				jid_data = {
					'code':ret['data']['jid'],
					'project_id':settings.SALT_MASTER_OPTS['project_id'],
					'serverip':ret['data']['id'],
					'returns':ret['data']['return'],
					'name':ret['data']['id'],
					'state':'success' if ret['data']['success'] else 'failed',
				}
				task_data = json.loads(task_data) if task_data else []
				task_data.append(jid_data)
				logger.info("新增数据:%s" % json.dumps(task_data))
				r_conn.lpush('task:prod:queue',json.dumps({'type':'setTaskData','jid':ret['data']['jid'],'data':task_data}))
				#r_conn.hset(task_key,'data',json.dumps(task_data))						
				if task_state == 'running':
					if len(task_data)>=1:
						logger.info('新增消息到队列:pushTaskData')
						r_conn.lpush('task:prod:queue',json.dumps({'jid':ret['data']['jid'],'type':'pushTaskData'}))
				else:
					logger.info('任务{0}完成,发送剩下的数据到后端...'.format(task_key))
					logger.info('新增消息到队列:pushTaskData')
					r_conn.lpush('task:prod:queue',json.dumps({'jid':ret['data']['jid'],'type':'pushTaskData'}))
				
				print datetime.datetime.now()
 
def run():
	print 'start redis product queue listerner...'
	logger.info('start redis product queue listerner...')
	multiprocessing.Process(target=RedisQueueDaemon(r_conn).listen_task,args=()).start()
	print 'start salt job listerner...'
	logger.info('start salt job listerner...')
	multiprocessing.Process(target=salt_job_listener,args=()).start()
 
	'''
	p=multiprocessing.Pool(2)
	print 'start redis product queue listerner...'
	p.apply_async(redis_queue_listenr,())
	print 'start salt job listerner...'
	p.apply_async(salt_job_listener,())
	p.close()
	p.join()
	'''

以上这篇python 监听salt job状态,并任务数据推送到redis中的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
python各种语言间时间的转化实现代码
Mar 23 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
Python几种酷炫的进度条的方式
Apr 11 Python
在python 不同时区之间的差值与转换方法
Jan 14 #Python
Python常见数据结构之栈与队列用法示例
Jan 14 #Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 #Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 #Python
利用nohup来开启python文件的方法
Jan 14 #Python
python运行时强制刷新缓冲区的方法
Jan 14 #Python
python xpath获取页面注释的方法
Jan 14 #Python
You might like
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
js实现密码强度检验
2017/01/15 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python实现类继承实例
2014/07/04 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
在python 中实现运行多条shell命令
2019/01/07 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
python3 线性回归验证方法
2019/07/09 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python hmac模块使用实例解析
2019/12/24 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
一套英文Java笔试题面试题
2016/04/21 面试题
会计专业自荐信范文
2013/12/02 职场文书
书法比赛获奖感言
2014/02/10 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
2014年销售部工作总结
2014/12/01 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
单身申明具结书
2015/02/26 职场文书
团支部书记竞选稿
2015/11/21 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python
Java死锁的排查
2022/05/11 Java/Android