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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
Python清空文件并替换内容的实例
Oct 22 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
Python3.5多进程原理与用法实例分析
Apr 05 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
python几种常用功能实现代码实例
Dec 25 Python
python的reverse函数翻转结果为None的问题
May 11 Python
python实现猜数游戏(保存游戏记录)
Jun 22 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&&mysql)六
2006/10/09 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
js控制框架刷新
2008/08/01 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
python对数组进行反转的方法
2015/05/20 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
python如何处理程序无法打开
2020/06/16 Python
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
团购业务员岗位职责
2014/03/15 职场文书
学雷锋宣传标语
2014/06/25 职场文书
花坛标语大全
2014/06/30 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
出租车拒载检讨书
2015/01/28 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
python执行js代码的方法
2021/05/13 Python