问题背景:搭建一个多节点后端集群,使用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 --version查看版本:salt 2017.7.1 (Nitrogen)

两台机器,搭建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.查询所有的job,通常job任务比较多,推荐使用 " > jobs.txt" 重定向到一个文件,再进行查找

2.配合missing=True参数使用,能够查询find_job是否丢失(实际上fetch-job也是一个job任务)。

3.打印job执行结果,在job没有执行结束的时候调用,返回为 minion not return

4.查找一个job,功能类似salt自带的fetch-job

总结:

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。(观察方法:fetch-job已经不再查找job,但手动使用saltutil.find_job能查找到job还在继续运行)

  c.在job没有执行结束的时候,使用jobs.list_jobs打印出的job没有返回,但在最终job执行结束后,原来的job会有返回值。说明salt会去修改job执行的结果,并不是类似日志一样,单纯根据时间来记录

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

问题依然没有解决,如果有相同问题的朋友,欢迎联系我交流 :)

关于saltstack的job问题的更多相关文章

  1. saltstack初探

    salt-key -y -d linux-node1 #删除linux-node1节点的认证 salt -G 'cpuarch:x86_64' grains.item num_cpus >> ...

  2. saltstack命令执行过程

    saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...

  3. Saltstack之salt-master的打开文件数问题

    一.引言: 单个salt-master下的minion数已经达到2101个了,所以在master日志有如下的提示: 2016-09-09 11:36:22,221 [salt.utils.verify ...

  4. Saltstack

    一.Satlstack的概述 Saltstack是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基 ...

  5. python virtualenv 安装运行saltstack

    需求产生场景:      1.python的virtualenv虚拟环境非常的好用.      2.saltstack作为运维自动化的一个重要组件也挺好用的. 但是:      1.saltsatck ...

  6. 自动化运维:网站svn代码上线更新(flask+saltstack)

    阶段性总结:      跌跌撞撞的用了一周左右的时间做完了网站自动升级功能,中间遇到了很多的问题,也学到了很多,在此做一个总结.   1.整体架构: 后台:nginx+uwsgi  #nginx提供w ...

  7. saltstack安装配置(halite)

    saltstack官方提供了一个简单的web UI--halite.但是给出的安装配置方法实在没法实现,在网上找了几篇博客,见文章末尾的参考链接,可以用起来了.但是功能有点简单.这篇文章记录安装配置h ...

  8. Saltstack异步执行命令(十三)

    Saltstack异步执行命令 salt执行命令有时候会有超时的问题,就是命令下发下去了,部分主机没有返回信息,这时候就很难判断命令或任务是否执行成功.因此,salt提供异步执行的功能,发出命令后立即 ...

  9. Saltstack之SSH(十一)

    Saltstack之SSH 安装 yum install -y salt-ssh 官方文档  https://docs.saltstack.com/en/latest/topics/ssh/index ...

  10. Saltstack之Syndic(十)

    Saltstack之Syndic 使用条件: 1.salt syndic必须运行在一台master上 2.salt syndic必须依赖更高级的master 安装 yum install -y sal ...

随机推荐

  1. Quartz.Net系列(十一):System.Timers.Timer+WindowsService实现定时任务

    1.创建WindowsService项目 2.配置项目 3.AddInstaller(添加安装程序) 4.修改ServiceName(服务名称).StartType(启动类型).Description ...

  2. node+express4+multiparty实现简单文件上传

    文件上传 var fs = require('fs'); var express = require('express'); var multiparty = require('multiparty' ...

  3. 每天一点python:正则表达式中的findall方法

    举例:使用findall获取所有匹配的正则表达式文本,然后逐一替换. #! python3 """ A regular expression example: find ...

  4. Java中多线程的使用(超级超级详细)线程池 7

    Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...

  5. TeamX

    介绍 TeamX 是基于 SolonJT 平台构建的团队管理小工具,主要功能有: Wiki(团队词条,用于写MD格式接口文档也行...) Planned(项目计划 和 个人日志) Issues(问题管 ...

  6. Java常用开源库

    Java的经久不衰,很大程度上得益于Java的生态好.在日常开发中,我们也会经常使用到各种开源库和工具类,为了避免重复造轮子,本文将贴出工作及学习中会用到的部分开源库和工具类.Java的生态实在太大, ...

  7. .net core 使用 Serilog 作为日志提供者

    nuget引入 Serilog.AspNetCore Startup构造函数: public Startup(IConfiguration configuration) { Configuration ...

  8. windows 下部署 .netcore 到 iis

    园子里已经有许多 ASP.NET Core  部署的相关文章,不同环境有不同的配置方法,建议同鞋们在动手之前也看看官方说明,做到心中有数.我在实践的时候用的是 win8.1 + .net core 3 ...

  9. spring学习(七)spring整合JDBC

    Spring中封装了一个可操作数据库的对象,该对象封装了JDBC技术 使用数据库 一.导包(IDEA的maven工程,在pom.xml文件中导入依赖,必须注意依赖,不然会报各种异常) <?xml ...

  10. Lun4R-CyBRICSCTF wp

    WEB Hunt (Web, Baby, 50 pts) 打断点,然后就一个一个被抓住了... 接着F12就出现了.(这个flag是白色的,藏在下面....)... RE Baby Rev 题目给了个 ...