首页 > 其他 > 详细

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

时间:2014-03-16 11:39:32      阅读:1110      评论:0      收藏:0      [点我收藏+]

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


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


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


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


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


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

bubuko.com,布布扣



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


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


bubuko.com,布布扣


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


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


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__":
    g = gevent.spawn(test)
    g.join()


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


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,给他们提过好几次类似的问题,还好都解决了。这次看看是啥问题 ~

bubuko.com,布布扣


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

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



本文出自 “峰云,就她了。” 博客,谢绝转载!

借用subprocess和gevent、multiprocess解决saltstack超时不准的问题,布布扣,bubuko.com

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!