学习贴:两步开启研发团队专属ChatOps
最近几天,ChatGPT 真是杀疯了 !
相信大家的朋友圈,已经被调戏、询问或探讨 ChatGPT 的贴子刷屏。
看到这个上知天文、下知地理,博古通今、学贯中西,不管什么问题都能告诉我们答案的 “杀手级应用”,不禁想问:“这么好玩东西不会只拿来玩吧,能不能帮我分担一些工作?”
虽然ChatGPT还没答应,但另一个不吃不喝不摸鱼的 “智能” 员工——ChatOps,已经在上班了。
一起来看极狐GitLab ChatOps 的设计与实践
「什么是 ChatOps?」
顾名思义,ChatOps 就是 Chat + Ops 的组合词,是使用即时通讯软件客户端、聊天机器人和实时通信工具,来促进软件开发和操作任务的通信和执行方式。ChatOps 往往也被认为是对话驱动的 DevOps。
在 ChatOps 中,所有任务都是由对话驱动,团队成员只需在聊天软件中键入相应的命令或包含相应关键字的内容,聊天机器人就会自动调用相关内容的平台,从而自动完成各种任务。
而这些任务的范围,从代码部署到安全事件响应,从团队成员通知到任务进度查询。理论上,ChatOps 可以继承 DevOps 大多数工具与优点,进一步提升团队自动化水平。
| 技术架构
一般来讲,ChatOps 由三部分组成:即时通讯软件客户端(也就是聊天 APP)、连接中心(机器人)、基础设施应用。
| 聊天APP
ChatOps 主要动作,就是将之前 DevOps 中通过 Web 页面进行的操作,通过聊天机器人来代替。也就是说,聊天 APP 成为用户进行操作的一个客户端,用户的任何操作,都可以通过聊天 APP 来实现。
这也为聊天 APP 提出了要求,它需要将用户的输入发送给响应与连接中心,也就是我们常说的聊天机器人,这样机器人才能进行后续的自动化操作。所以聊天 APP 需要支持像 slash commands 或 outgoing 这样的机制,允许用户将自己在聊天框中输入的内容发送向第三方平台。
| 连接中心
一般情况下,大家都喜欢叫这部分为机器人或聊天机器人,但这个表述并不精确,经常会造成误解,所以这里将其描述为连接中心。
它的工作就是接收聊天 APP 发送来的消息,识别处理消息内容,根据识别内容调用基础设施中的应用,等待基础设施应用完成任务,并返回通知(可选)。
可以看出这部分的主要作用,就是接受识别请求并连接基础设施应用,只有在识别请求处接入自然语言识别系统,其能力才更贴近机器人。
| 基础设施应用
这部分与 DevOps 系统与各个基础设施应用的连接方式相同,如果已有则可以直接复用,需要注意的是,基础设施应用不同版本的 API 可能有所差异,需要谨慎维护这部分代码。
「极狐GitLab ChatOps 功能与实践」
极狐GitLab 已和国内外众多主流 IM 产品进行集成,从而实现 ChatOps。
如飞书、钉钉、Slack、Mattermost、Discord、Google Chat、Microsoft Teams、Webex Teams。其中和飞书、钉钉的集成是极狐专享功能,已在极狐GitLab 15.1 旗舰版本正式对外发布。
在极狐GitLab SRE 团队如何落地实践 ChatOps?
| 需求
极狐(GitLab) SRE 团队的日常工作大部分都实现了代码化,并分布在各个项目。
例如,服务器配置管理放在 ansible playbooks 项目里,K8S 部分部署放在了 helm chart 项目中,还有一系列基于目标系统 api 的操作需求。
SRE 团队希望基于 ChatOps,可以进一步降低这些自动化资产使用的复杂度,使团队成员都可以轻松上手琐碎的运维工作,实现操作与操作人解耦;同时,包装好的命令也可以在程序上对操作者的行为做出一定限制,避免操作者直接接触环境,提高操作安全性。
| 设计与实现
为此,极狐(GitLab) SRE 创建了 ChatOps(名为chatops-go)项目,该项目直接与 Slack 的 slash command 绑定,作为运维统一入口。
1.多项目下的 ChatOps 命令模式
由于 SRE 运维脚本分布在各个项目中,我们将 ChatOps 的命令类型分成这三种模式:
- 直接执行:针对一些快速的、简单的 API 操作,执行动作直接在 ChatOps 项目中完成。
- 触发下游并等待:ChatOps 的 job 不会直接执行操作任务,而是触发下游项目流水线,并等待下游流水线的返回结果。这个场景适用于,对应的系统需要较为复杂的维护脚本(如ansible palybook),且这些脚本在其他项目中。
- 触发下游并直接返回:仍然通过 ChatOps 触发下游项目流水线,但是触发成功后不等待下游流水线执行完成,而是直接返回流水线的链接地址。这个场景适用于,要触发的任务耗时较长,如环境升级等。
2.权限控制
在 ChatOps 中,我们往往需要比常规的流水线控制,更细粒度的权限划分。如小 A 作为 SRE 可以调整负载均衡的流量配比,小 B 作为开发可以查看当前环境下某个功能开关的的开启状态等。
极狐 GitLab 在这方面支持很好的扩展。在 ChatOps 触发的流水线作业中,我们可以通过一些CI预定义的变量,在权限上做一些「手脚」:
- CHAT_INPUT:用户通过 ChatOps 传入的额外参数;
- CI_JOB_NAME:用户通过 ChatOps 执行的命令名称;
- CHAT_CHANNEL:用户执行 ChatOps 命令时所在的Slack channel;
- GITLAB_USER_LOGIN:执行 ChatOps 命令的用户在极狐GitLab 中绑定的用户名。
通过这些变量,ChatOps 程序可以很好的回答这些问题:是谁在执行?在哪执行?执行了什么命令?传入了那些参数?
得到这些问题的答案后,接下来,就是 ChatOps 项目做权限判断的时候了。
| 使用场景
以下就是极狐(GitLab) SRE 团队的 ChatOps 日常使用场景:
1.开启极狐GitLab SaaS的功能开关
这是一个直接执行的命令模式。直接通过 ChatOps CI 中的程序与极狐GitLab SaaS 的功能开关做交互,实现功能开关管理。
使用示例:
2.管理负载均衡的流量比
极狐GitLab SRE 的大量服务器配置管理工作依赖于 Ansible playbook 项目,因此此类工作不会直接在ChatOps 自动完成。这个命令采用的是「触发下游并等待」的模式,命令传入到 ChatOps 项目后,触发Ansible playbook项目流水线,实现对负载均衡器管理。
使用示例如下:
3.管理Helm Chart部署
K8S 上的负载通过 helmfile + hem chart 管理,因此也不会直接在 ChatOps 项目中执行。出于部署时长和安全性的考虑,ChatOps 只会直接返回部署流水线的 URL,并且使用者需要在该流水线中点击手动作业才会执行。
使用示例如下:
以上,就是 ChatOps 的定义、价值与最佳实践。
在 ChatOps 能力加成下,极狐GitLab 能够帮助企业研发团队大幅提升工作效率与工作体验,已获得众多客户认可。
虽然现在的 ChatOps 相较于 ChatGPT,还过于稚嫩。但我们相信在不远的未来,ChatOps 一定会成长为研发团队更智能和贴心的伙伴。ChatOps 下一步如何发展?让我们拭目以待。
#技术栈##技术交流##研发##极狐Gitlab##面试八股文#