日常运维工作中有许多的任务要执行,例如项目发布/数据备份/定时巡检/证书更新/漏洞修复等等,大部分的任务都会有多个步骤共同完成,例如一个发布任务会有拉代码、编译、分发、通知等等步骤,而不同的任务可能还包含相同或相似的步骤,例如对于相同语言相同架构的不同项目来说,他们的发布任务步骤可能是相同的,仅仅是几个参数不同而已,为此我们上线了任务系统,任务系统可以像乐高搭积木一样组合不同的步骤(也就是子任务)为一个模板,然后基于模板配合参数来创建任务并执行,灵活且高效

其中子任务的类型越丰富则上层模板的组合方式就会越多样,从而最终的任务覆盖场景就能越全面,目前任务系统子任务的类型已经支持了命令、脚本、作业、Jenkins、审批、通知、API、告警策略和事件规则,之前有篇文章任务系统之Jenkins子任务介绍过Jenkins类型子任务的实现,那这篇文章来介绍下另一个很重要的子任务类型:API

API的使用场景非常之广,在现代的Web系统中绝大部分的操作都可以由API来完成,任务系统对API类型子任务的支持不仅使得任务系统的覆盖场景更加的全面,同时也使得API的调用更加的方便和安全。在未支持API类型子任务之前,任务系统都是通过脚本类型子任务由用户自己编写脚本来实现API调用的,这种方式虽然可用但存在问题,其一是因为写脚本对用户有一定的能力要求,同时增加了复杂度,其二也更为关键的是不安全,API往往需要验证,验证内容写在脚本中,脚本明文存储在数据库中,增加了安全风险,集成API类型子任务可以完美解决这两个问题

API类型子任务的使用方式很简单,只需要三步,第一步新建API,第二步新建API类型的子任务,这里选择第一步创建的API,第三步在任务模板中添加第二步创建的子任务,然后就可以新建任务执行了。其中第二第三步是任务系统的通用流程,这里重点说下第一步关于API的创建,API与Jenkins一样是作为一个插件存在于系统中的,由独立的API管理页面

点击右上角添加按钮之后就可以添加新的API了,创建表单主要包含名称、请求、参数和成功条件四块内容

名称就是个输入框,标识这个API的名称,清晰易理解就好

请求和参数用来配置这个API的主要属性,包含了Method、URL、Parameters、Body、Headers、Cookies和Authentication认证方式配置,页面参考了Postman的设计。其中认证方式的话支持Basic、BearerToken和APIKey,后续也可以根据需要新增更多的认证方式,甚至直接接入多云的认证,实现云上API的便捷使用,以弥补多云系统的不足

前后端通过JSON格式实现数据交互,前端根据输入的请求和参数组装成JSON格式提交给后端,后端则根据认证方式加密对应的密码或Token字段并保存到数据库,当任务请求发起时从数据库获取JSON数据并解密,解析解密后的JSON数据调用Requests模块请求并获取结果

最后一块是判断API是否请求成功的规则集,默认情况下会判断API的返回状态码,如果状态码为2xx或者3xx都认为是成功的,当然用户也可以根据状态码或是响应体自定义成功的规则,例如某些情况下你可能仅需要API返回200表示成功,或者是响应体里的state字段为1算成功,都可以通过自定义灵活的配置。判断API是否请求成功很重要,在一个任务流中,某个步骤的成功与失败直接影响后续步骤的执行,API也不例外,当API任务执行失败时则终止任务流程的执行

前端组装好的JSON格式参考如下

{
"name": "获取Github仓库blog的branches",
"api": {
"method": "GET",
"url": "https://api.github.com/repos/ops-coffee/blog/branches",
"parameters": [],
"body": "",
"headers": [{"name": "Content-Type", "note": "", "type": "string", "value": "application/json"}],
"cookies": [],
"authorization": {
"type": "Bearer",
"bearer_token": "ghp_3dtK****************IIcN",
}
},
"success": [
{"key": "status_code", "type": "状态码", "value": ["200"], "operator": "匹配"},
{"key": "name", "type": "响应体", "value": "main", "operator": "等于"}
]
}

后端加解密的方法可以参考文章Model字段加密的优雅实现,Request请求则比较简单

# 不同的认证类型使用不同的请求方式
if authorization.get("type", "").lower() == "basic":
auth = (authorization.get("basic_username", ""), authorization.get("basic_password", ""))
response = requests.request(method, url, params=parameters, headers=headers, cookies=cookies, auth=auth,
data=body) else:
if authorization.get("type", "").lower() == "bearer":
headers["Authorization"] = "Bearer " + authorization.get("bearer_token", "") elif authorization.get("type", "").lower() == "apikey":
headers[authorization.get("api_key_key")] = authorization.get("api_key_value", "") response = requests.request(method, url, params=parameters, headers=headers, cookies=cookies, data=body) # 解析Response结果判断是否成功
......

API创建完成后就可以添加子任务,添加了子任务就可以将子任务添加到模板,最后创建任务并执行了,执行结果实时输出

至此API类型子任务介绍完成,API类型子任务快速打通了任务系统与三方的链接,为任务系统增加了无限可能,期待它在业务中的表现

任务系统之API子任务的更多相关文章

  1. 分布式任务系统gearman的python实战

    Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统.Gearman是一个分发任务的程序框架,可以 ...

  2. Flink Program Guide (3) -- Event Time (DataStream API编程指导 -- For Java)

    Event Time 本文翻译自DataStream API Docs v1.2的Event Time ------------------------------------------------ ...

  3. Zigbee协议栈OSAL层API函数【转载】

              OSAL层提供了很多的API来对整个的协议栈进行管理.主要有下面的几类:信息管理.任务同步.时间管理.中断管理.任务管理.内存管理.电源管理以及非易失存储管理.看到这些管理是不是感 ...

  4. 【java多线程】java8的流操作api和fork/join框架

    原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...

  5. AssetBundle加载API

    AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...

  6. App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点

    1. 争取相容性和统一性 这里就要求让API设计得是可预测的.按照这种方式写出所有接口和接口所需要的参数.现在就要确保命名是一致的,接口所需的参数顺序也是一致的.你现在应该有products,orde ...

  7. java多线程核心api以及相关概念(一)

    这篇博客总结了对线程核心api以及相关概念的学习,黑体字可以理解为重点,其他的都是我对它的理解 个人认为这些是学习java多线程的基础,不理解熟悉这些,后面的也不可能学好滴 目录 1.什么是线程以及优 ...

  8. Java 函数式编程(Lambda表达式)与Stream API

    1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...

  9. c++小学期大作业攻略(四)任务系统+站内信

    虽然比最早的预定晚了整整一个星期但这核心功能最后一篇终于还是来了. 如果你已经经历了用户系统的洗礼,相信代码实现应该已经没有太大的难度,所以我们重点关注一下设计好的流程. 一.任务系统 首先是新建任务 ...

  10. Fork/Join框架与Java8 Stream API 之并行流的速度比较

    Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...

随机推荐

  1. [转帖]Redis 核心篇:唯快不破的秘密

    文章系转载,方便整理和归纳,源文地址:https://z.itpub.net/article/detail/4B5A03BDDBE9A2BC3E080E278FE4D21E 以下文章来源于码哥字节 , ...

  2. [转帖]Linux中最全shell命令&常用注意事项

    在编辑linux脚本中不断的会用到复杂的脚本编辑,写文章记录. Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 目录 推荐书籍: Linux常用命令 Linux 常用命令 在li ...

  3. [转帖]Linux命令拾遗-动态追踪工具

      原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 这是Linux命令拾遗系列的第六篇,本篇主要介绍工作中常用的动态追踪工具strace.arthas.bpft ...

  4. [转帖]RFC1180

    [译] RFC 1180:朴素 TCP/IP 教程(1991) 译者序 本文翻译自 1991 年的一份 RFC(1180): A TCP/IP Tutorial. 本文虽距今将近 20 年,但内容并未 ...

  5. 使用shell进行简单分析增量更新时间的方法

    使用shell进行简单分析增量更新时间的方法 思路 产品里面更新增量时耗时较久, 想着能够简单分析下哪些补丁更新时间久 哪些相同前缀的补丁更新的时间累积较久. 本来想通过全shell的方式进行处理 但 ...

  6. 浅浅的源码剖析grpc-go(一)

    最近在学习 rpc 相关的知识,如果让我去从头设计一个 rpc,我从使用者的角度出发,究竟需要去做一下什么工作? 第一,RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据.虽然传输协议可以 ...

  7. axios取消请求

    为什么会有取消请求-文件上传 比如有这样的场景,在一个弹窗中有文件上传. 当用户进行文件上传的时候,发现不想进行文件上传了,又点击了弹窗中的取消. 那么是不是应该去取消本次的上传操作,此时就需要使用取 ...

  8. 微信小程序之某个节点距离顶部和底部的距离 createSelectorQuery

    这个方法可以用来在上滑滚动的时候,让某一个区域置顶, 在下滑的时候,又变为原来的位置哈! <huadong :class="{'hident':isFixed}" id=&q ...

  9. Vue基础系列文章10---单文件组件

    1.单文件组件的结构 <template> <!--这里用于定义VUE组件的模块内容--> <dvi> <h1>这是 APP 根组件</h1> ...

  10. C# MVC+NHibernate 分页

    一.页面代码,分为三部分,一是查询条件部分,二是数据部分,二是页码条 <div id="ticketoutquery"> <table> <tr> ...