问题背景:搭建一个多节点后端集群,使用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. 二、python 中五种常用的数据类型

    一.字符串 单引号定义: str1 = 'hello' 双引号定义: str1 = "hello" 三引号定义:""" 人生苦短, 我用python! ...

  2. redis(十九):Redis 架构模式,特点

    单机版 特点:简单 问题: 1.内存容量有限 2.处理能力有限 3.无法高可用. 主从复制 Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的 ...

  3. 机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD(七) 附录

  4. 状态模式(c++实现)

    状态模式 目录 状态模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 状态模式(state),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 模式动机 状 ...

  5. Active Directory - Server Remote administration management

    Windows Admin Center: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-admin-center Remot ...

  6. 面试锦囊 | HTTP 面试门路

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习清单: 零.前置知识 幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同 一.PUT ...

  7. 关于Object.defineProperty

    讲解大致会根据下图展开     本文部分参考了书籍<你不知道的javascript>上卷 对象的定义与赋值 经常使用的定义与赋值方法obj.prop =value或者obj['prop'] ...

  8. Python 编程语言的核心是什么?

    01 Python 编程语言的核心是什么? ​   为什么要问这个问题? 我想要用Python实现WebAssembly,这并不是什么秘密.这不仅可以让Python进入浏览器,而且由于iOS和Andr ...

  9. 五分钟快速搭建Serverless免费邮件服务

    1. 引言 本文将带你快速基于 Azure Function 和 SendGrid 构建一个免费的Serverless(无服务器)的邮件发送服务,让你感受下Serverless的强大之处. 该服务可以 ...

  10. npm 使用报错合集

    1.Unexpected end of JSON input while parsing near '...e,"directories":{},"d' 这个问题经常会出 ...