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装饰器使用方法实例
Nov 21 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
浅谈Python中的私有变量
Feb 28 Python
python获取代码运行时间的实例代码
Jun 11 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python理解递归的方法总结
Jan 28 Python
Django REST framework 视图和路由详解
Jul 19 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python接口测试数据库封装实现原理
May 09 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
python爬虫中抓取指数的实例讲解
Dec 01 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
Vue Promise的axios请求封装详解
2018/08/13 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python中DJANGO简单测试实例
2015/05/11 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
python实现静态服务器
2019/09/05 Python
Python 在函数上添加包装器
2020/07/28 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
百度JavaScript笔试题
2015/01/15 面试题
年会活动策划方案
2014/01/23 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
劳资协议书范本
2014/04/23 职场文书
供电工程专业求职信
2014/08/09 职场文书
小学教师自我评价
2015/03/04 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
民事调解协议书
2016/03/21 职场文书
MySQL深分页问题解决思路
2022/12/24 MySQL