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 相关文章推荐
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
python保存字典和读取字典的实例代码
Jul 07 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
宝塔更新Python及Flask项目的部署
Apr 11 Python
利用Python实时获取steam特惠游戏数据
Jun 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 trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP 中常量的知识整理
2017/04/14 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
js confirm()方法的使用方法实例
2013/07/13 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
python 的列表遍历删除实现代码
2020/04/12 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python3人脸识别的两种方法
2019/04/25 Python
python数组循环处理方法
2019/08/26 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
Linux的文件类型
2012/03/07 面试题
化工专业个人的求职信范文
2013/11/28 职场文书
廉洁教育学习材料
2014/05/19 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
写给父母的感谢信
2015/01/22 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
Python 数据可视化之Matplotlib详解
2021/11/02 Python
MySQL中order by的使用详情
2021/11/17 MySQL