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实现比较两个列表(list)范围
Jun 12 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python列表生成式与列表生成器的使用
Feb 23 Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
python开启debug模式的方法
Jun 27 Python
Django 迁移、操作数据库的方法
Aug 02 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
python openpyxl模块的使用详解
Feb 25 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支持页面回退的两种方法
2008/01/10 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
Python中正则表达式的详细教程
2015/04/30 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python中six模块基础用法
2019/12/08 Python
Pyqt5自适应布局实例
2019/12/13 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
python如何获取apk的packagename和activity
2020/01/10 Python
pytorch中图像的数据格式实例
2020/02/11 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
应届生简历中的自我评价
2014/01/13 职场文书
工伤赔偿协议书
2014/04/15 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
关于感谢信的范文
2015/01/23 职场文书
Python数据类型最全知识总结
2021/05/31 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL