设为首页 收藏本站
查看: 1374|回复: 0

[经验分享] 借用subprocess和gevent、multiprocessing解决saltstack超时不准的问题

[复制链接]

尚未签到

发表于 2018-8-1 11:01:52 | 显示全部楼层 |阅读模式
  新版的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
DSC0000.jpg

  咱们先用一个常用的方式,可以用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()
DSC0001.jpg

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

  原文:http://rfyiamcool.blog.51cto.com/1030776/1377429
  上面的方法也只是临时的解决,我这里还是希望saltstack快点解决这个bug  ~  另外的是 别总是出新版和大量的新功能更新,还是一步步的来。 步子迈的太大,容易扯到蛋 !

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544671-1-1.html 上篇帖子: saltstack管理nagios脚本 下篇帖子: Saltstack 利用pillar实现redis多实例部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表