借用subprocess和gevent、multiprocessing解决saltstack超时不准的问题

简介:

 新版的saltstack真是个坑!  前段时间为了做测试,直接从openstack那边搞了几台服务器,接入运维平台开始部署客户端minion的环境,直接yum的saltstack,当时也没有注意,就直接跑lvs的增删改查测试。  当天没出啥问题,今天再测试的时候,感觉前端总是拿不到数据,扯了半天,发现saltstack的超时不好用了,一开始还不知掉问题,后来通过日志,定位到salt超时问题。    


    以前用16和17的时候,虽然也不准,但是最少还是会主动的切断链接,2014版本倒好,只有结束才给你返回。


对于2014这个版本,我只能是服气,从一开是就很是蛋疼的~    


     看了下saltstack的源码,在对于zeromq操作的地方,有对时间参数的用法,但是貌似出问题,把源码里面的时间又减小了点,效果还是不稳,找了下saltstack对于任务的多进程分发,但是multiprocessing对于时间处理,貌似没问题。 但还是强改了下,结果。。。。。哥哥我真心有点怕了。。。  既然saltstack 可通过multiprocessing来控制链接的中断停止,那我就改源代码了,我重新写个模块定义超时中断,方法微微有点粗暴 !


下面是我一开始的效果,去minion执行sleep的命令,结果无效果。。。我估计会是版本的问题。


原文:http://rfyiamcool.blog.51cto.com/1030776/1377429

wKiom1Mkktehir_vAANIuCfPe2w301.jpg



咱们先用一个常用的方式,可以用subprocess的老方法, signal 的方式搞定超时控制。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import  subprocess,os, time, signal
#
def timeout_cmd(cmd, timeout):
     timeout=timeout- 1
     command = cmd.split( " " )
     import  subprocess, datetime, os, time, signal
     start = datetime.datetime.now()
     process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     while  process.poll()  is  None:
         time.sleep( 0.1 )
         now = datetime.datetime.now()
         if  (now - start).seconds> timeout:
             os.kill(process.pid, signal.SIGKILL)
             os.waitpid(- 1 , os.WNOHANG)
             return  None
     return  process.stdout.read()


wKioL1MklF3DkduSAAPkXtNPOaE567.jpg


在这里提一下,用saltstack  api的超时,默认控制在10s的,但我抓到一个微妙的特征,10左右,时间算是精确中断,但是时间一高,你的超时精确就有点不准了。


下面的方法是用gevent的控制超时,如果没有结果返回,会直接切掉连接,并返回一个None 空值。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import  gevent
import  gevent.monkey
import  urllib
import  salt.client
gevent.monkey.patch_all()
                                                                                                                                                                                                                                                                                                                                                                                                                                                              
def  test():
     #就这么用,7是超时时间,后面的False表示不抛出其他异常了!
     with gevent.Timeout( 7 False ) as timeout:
         local  =  salt.client.LocalClient()
          local.cmd( '*' 'cmd.run' , [ 'ip a' ])
                                                                                                                                                                                                                                                                                                                                                                                                                                                              
if  __name__  = =  "__main__" :
     =  gevent.spawn(test)
     g.join()


当然从前端过来的任务用multiprocess的join做超时时间也是可以的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from multiprocessing  import  Process
import  os
#xiaorui.cc
def f(mip):
     info( 'function f' )
     print  'hello' , mip
     import  salt.client
     local = salt.client.LocalClient()
     local.cmd( '*' 'cmd.run' , [ 'ip a' ])
if  __name__ ==  '__main__' :
     info( 'main line' )
     p = Process(target=f, args=( '10.58.11.231' ,))
     p.start()
     p.join( 5 )


join([timeout])


父进程被停止,直到子进程被执行完毕。当timeout为None时没有超时,否则有超时。进程可以被join很多次,但不能join自己 !


再给salt他们提提bug,给他们提过好几次类似的问题,还好都解决了。这次看看是啥问题 ~

wKiom1Mkm5ni4MWVAAINDk3iMVM834.jpg


原文:http://rfyiamcool.blog.51cto.com/1030776/1377429

   上面的方法也只是临时的解决,我这里还是希望saltstack快点解决这个bug  ~  另外的是 别总是出新版和大量的新功能更新,还是一步步的来。 步子迈的太大,容易扯到蛋 !




 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1377429 ,如需转载请自行联系原作者


相关文章
vscode设置自动保存步骤
vscode设置自动保存就不用每次要运行时候去先保存一下才能加载新页面了
18778 0
vscode设置自动保存步骤
|
SQL HIVE
Hive 字符串截取前两位和截取后两位
Hive 字符串截取前两位和截取后两位
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1060 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
736 23