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

其中子任务的类型越丰富则上层模板的组合方式就会越多样,从而最终的任务覆盖场景就能越全面,目前任务系统子任务的类型已经支持了命令、脚本、作业、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. [转帖]Nginx动静分离详解以及配置

    https://developer.aliyun.com/article/885602?spm=a2c6h.24874632.expert-profile.314.7c46cfe9h5DxWK 简介: ...

  2. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...

  3. k8s笔记——NodePort暴露nginx-controller实现https自动跳转自定义nodePort端口

    安装nginx-controller并暴露nodePort helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx ...

  4. PGO前瞻

    原文在这里. 原文发布于2023年2月8日 在构建Go二进制文件时,Go编译器会进行优化,以尽可能生成性能最佳的二进制文件.例如,常量传播可以在编译时对常量表达式进行求值,避免了运行时的计算开销:逃逸 ...

  5. 离线下载和安装UWP(windows应用商店)软件

    离线下载uwp安装包 打开商店,然后搜索您要的应用程序名称,进入应用界面 点击 分享按钮,在弹出窗口中选择[复制链接] 把链接粘贴到:https://store.rg-adguard.net/ 默认选 ...

  6. 【Mysql】复合主键和联合主键的区别

    复合主键: create table index_test ( a int not null, b int not null, c int not null, d int null, primary ...

  7. Visual Studio安装教程、Visual Studio2017软件提供,版本序列号丨编写第一个程序。

    一.安装步骤 1.安装前注意一下自己电脑的IE浏览器是不是10 版本及以上的,如果不是要先升级到10才能安装 Visual Studio2017.打开IE浏览器,点击[设置]接着点击[关于]即可查看. ...

  8. 【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程

    链表的合并 导航小助手 说在前面 题目链接 链表结构 OJ21.合并两个有序链表 题目描述和算法分析 接口的完整实现代码 OJ23.合并K个升序链表 题目描述和算法分析 接口的完整实现代码 尾声 说在 ...

  9. 使用私有gitlab搭建gitbook持续集成

    目录 环境搭建 1. 安装 Node.js 2. 安装 gitbook 3. 安装 Gitlab Runner 4. 注册Runner gitbook 配置 1. 目录结构 2. 命令行 3. 插件 ...

  10. MySQL架构体系介绍

    一.MySQL的完整架构体系 MySQL完整的架构体系: (1)Connectors 指的是不同语言中与SQL的交互. (2)Connection Pool 管理缓冲用户连接,线程处理等需要缓存的需求 ...