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实现的使用telnet登陆聊天室实例
Jun 17 Python
Python编程之字符串模板(Template)用法实例分析
Jul 22 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python实现电脑自动关机
Jun 20 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
对python中UDP,socket的使用详解
Aug 22 Python
pytorch 自定义参数不更新方式
Jan 06 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
python中的时区问题
Jan 14 Python
用Python提取PDF表格的方法
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在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
会计自我鉴定
2013/11/02 职场文书
技术人员面试提纲
2013/11/28 职场文书
销售经理竞聘书
2014/03/31 职场文书
青年文明号申报材料
2014/12/23 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书