码迷,mamicode.com
首页 > 其他好文 > 详细

关于saltstack的job问题

时间:2017-09-17 16:31:10      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:机器   返回   节点   http   系统   字符   sleep   问题:   第一个   

问题背景:搭建一个多节点后端集群,使用saltstack作为底层管理,使用Python封装saltstack接口成逻辑层。通过逻辑层的调用实现对整个集群的运维管理。

问题:随着项目中模块的增多,发现saltstack并不能很好的满足集群管理功能。原因就是saltAPI的返回值不一定正确。简单的来讲,salt每一个接口(以下所有的saltAPI均指salt同步接口)调用时都会产生一个job,当job在5s(默认参数)内没有返回时候,会产生一个fetch-job去查找执行的job,每10s检测一次,判断job是否还在运行,然后返回结果。但salt的机制中fetch-job不一定能拿到job的返回值,为不可信的。在实际测试中发现,调用salt-api时,salt-api返回为空(正常应该为一个字典或字符串,多个salt-api执行时容易出现异常情况),使用fetch-job去查找job,试图获取返回值,但发现fetch-job也为不可信的(原因就是fetch-job一旦有一次查找job失败,则停止查找)

 

环境准备:

两台机器,搭建salt-master(ip:192.168.136.191) salt-minion(ip:192.168.136.191,ip:192.168.136.192)

技术分享

1.演示fetch-job

在191主机上执行test.sleep 20,然后通过salt-run查看

技术分享

通过salt-run jobs.list_jobs 查看上一步中执行的任务

技术分享

分析:其中第一个标注中,是执行的test.sleep 20秒任务,然后在5s之后,也就是15:08:41时候,触发了一个find_job。此时,find_job成功找到job,所以没有返回。第三个标注中,触发了第二个find_job,在这个job之后没有find_job任务了(find_job在没有找到job时,不继续执行了),可以认为这个find_job是没有找到job了。

补充测试,下面一个是执行test.sleep 25秒的结果,分析同上。

技术分享

 

2.继续探究

我尝试模拟fetch-job失败的情况,但是没有重现。可能的原因是模拟的系统太单一,没有完整项目的复杂。完整的项目中,涉及到的模块多,都是调用salt-api接口,就可能造成fetch-job失败的情况。总的来说,在系统简单的时候,salt-api返回值是可信的,但随着系统模块的增加,会导致返回值不能成功返回。

 

总结:

1.简单系统在使用salt-api时候,salt-api能按照期望的返回。(具体什么程度为简单,没有具体的数据,只是真实项目中做到后期,模块量庞大的时候发现了这个问题)

2.复杂系统使用salt-api接口的时候,会有以下情况:

a.单纯的使用salt-api接口,接口已经返回,返回为空(没有返回值)。但实际job依然在执行,待job真实执行结束后,通过salt-run jobs.print_job xxx,能查看返回值。在没有执行结束的时候查看,返回为【minion not return】(xxx为jid, 即job id,文中图里的每一组数据唯一标识)

b.为了解决a中问题,等待fetch-job不再查找时,认定job执行成功。在实际操作中,观察到fetch-job可能会失败,即job实际还在运行,但fetch-job查找job失败,然后不再继续fetch-job。

3.实际情况中,最终所有的job能执行成功,但问题的关键在于这个成功是不可控的。无法获知一个指令执行的结束时间,也就无法获取其执行结果。

 

关于saltstack的job问题

标签:机器   返回   节点   http   系统   字符   sleep   问题:   第一个   

原文地址:http://www.cnblogs.com/newguy/p/7535865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!