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求算数平方根和约数的方法汇总
Mar 09 Python
python直接访问私有属性的简单方法
Jul 25 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python装饰器用法实例分析
Jan 14 Python
python文件写入write()的操作
May 14 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python 读取修改pcap包的例子
Jul 23 Python
python银行系统实现源码
Oct 25 Python
python实现从wind导入数据
Dec 03 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
python本地文件服务器实例教程
May 02 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 array的学习笔记
2012/05/16 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
Python中的列表生成式与生成器学习教程
2016/03/13 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
python pygame实现2048游戏
2018/11/20 Python
Python中按键来获取指定的值
2019/03/02 Python
Python reduce函数作用及实例解析
2020/05/08 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
python怎么调用自己的函数
2020/07/01 Python
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
目标管理责任书
2014/04/15 职场文书
优秀语文教师事迹
2014/05/18 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
宾馆客房管理制度
2015/08/06 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android