网络编程
位置:首页>> 网络编程>> Python编程>> python 监听salt job状态,并任务数据推送到redis中的方法

python 监听salt job状态,并任务数据推送到redis中的方法

作者:云中不知人  发布时间:2022-09-14 05:19:47 

标签:python,salt,job,redis

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()
'''

来源:https://blog.csdn.net/u011085172/article/details/81228450

0
投稿

猜你喜欢

  • 问题:Python2获取包含中文的文件名是如果不转码会出现乱码。这里假设要测试的文件夹名为test,文件夹下有5个文件名包含中文的文件分别为
  • 本文实例讲述了Python实现随机创建电话号码的方法。分享给大家供大家参考,具体如下:当需要随机的生成一些电话号码的时候,可以使用以下脚本,
  • 人生苦短,我用python!为什么很多人喜欢用python,因为包多呀,各种调包。但是调包有的时候也调的闹心,因为安装包不是失败就是很慢,很
  • 实例如下:/** * 数字格式转换成千分位 *@param{Object}num */function commafy(num){ &nbs
  • PDO::getAttributePDO::getAttribute — 取回一个数据库连接的属性(PHP 5 >= 5.1.0, P
  • 登录页面能访问得到,但当执行下级目录的文件就不行了,浏览器直接跳出以下错误页面: 除些以外没有任何其它有价值的信息,因为此网站在我的电脑上执
  • Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板。模板引擎是一个库,旨在将模板与数据结合起来以生成
  • 本文实例讲述了php广告加载类的用法,非常实用。分享给大家供大家参考。具体方法如下:该php广告加载类,支持异步与同步加载。需要使用Jque
  • 金额大小写转换的asp完全无错版本,  这个版本解决了小数位不能到分的问题,处理方式符合会计方式,值得推荐!<!--#inc
  • 我们现在使用的验证手段都是以验证码为主,让用户根据图片输入验证字符,这种方法的安全度尚可,但会给用户带来一些不便和困扰,比如这个雅虎的验证码
  • pyplot直方图的绘制import matplotlib.pyplot as pltimport numpy as npfrom pyla
  • SQL语句参考及记录集对象详解1. ASP与Access数据库连接:2. ASP与SQL数据库连接:建立记录集对象:set rs=serve
  • 以前看过有人转换过的,当时仅仅惊叹了一下,就过去了,没有记下来,直至于用到的时候呢,开始到处找,找来找去都没有找不到痕迹了,心里也就郁郁寡欢
  • 分水岭技术是一种众所周知的分割算法,特别适用于提取图片中的相邻或重叠对象。使用分水岭方法时,我们必须从用户定义的标记开始。这些标记可以使用点
  • 概述Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展,Python的职位需求越来越高。下面我收集了10个Pyth
  • 本文实例为大家分享了python pygame实现五子棋双人联机的具体代码,供大家参考,具体内容如下同一局域网内,服务端开启时,另一机器将I
  • 今天群上面同志们在讨论css3内发光效果,自己也就研究一下,写了个效果出来,涉及css3投影,渐变,蒙版,伪类等知识点,现在写下设计思路,仅
  • 想要追赶 Python 的热潮,应该如何学习呢?现在许多人在自学之外,都会选择去培训机构学习。选择培训机构的的标准是什么呢?什么样的pyth
  • <?php //本功能主要是利用文件修改时间函数filemtime与现在时间作减法判断是否更新内容。 $cahetime=2;//设置
  • 前端代码要做到简洁易读、高效,还要考虑后端嵌套的方便性。前段时间做了一个导航,把整个制作过程重现,希望对大家有帮助。看到这样的导航,你会怎么
手机版 网络编程 asp之家 www.aspxhome.com