攻守兼备OPSTicket系统设计实践

:下面带来演讲的是UCloud的运维架构师赵振华,给我们带来的演讲题目是攻守兼备:OPSTicket系统设计实践。年至年,就职于聚力传媒有限公司,点直播系统、上片系统运维负责人。年至今,就职于Ucloud,任职运维架构师。

:各位互联网朋友们大家下午好,很高兴能够在运维大会给大家做分享,我分享的题目是攻守兼备,OPSTicket系统设计实践。

对于OPSTicket系统来讲,95%的工单需求都可以通过零开发的交互,但是一些特殊工单,可以用少量的代码开发来完成整个工单的系统交互,所以我们称为攻守兼备的工单系统。

我们提出一个0到1的概念,日常工单开发中都有一种情况,刚到一个公司或者刚接到一个项目的时候,是从0开始,新建一个工程或者做一个前端,最后再做后端,完全是从0开始做起。就像我们公司有一个同事,他大概半年交付四个工单,但是整个交付质量不是特别高,天天被产品部门和用户追杀,有各种困境。但是现在运维变革发展这么复杂,如果大家的工单只是放在基础的工作操作上,对于整个工作质量影响是非常大的,所以我们提出一个0.5到1的概念,我们怎么能够把这些非常基础的工作,能够抽象出来,最终达到快速交互的目的。

提起工单系统大家都不陌生,什么是工单系统?就像报销的、请假的都属于工单系统范畴,对于这种工单系统就有一个特点,管理一个有流程的事情,这种逻辑架构是三层,上面是用户层,还有用户层面,结果通过系统逻辑来实现扭转的架构。但是这种架构在运维系统里,能不能满足需求?很显然是不能,举个简单例子,在运维检测的时候,有人提出申请,有人把它审批通过,有人去处理,如果按照第一种方式来做的话,解清这个过程是离线做,用户离线操作是没有经过审核的,而且从另外一个角度讲,现在有一个运维是可以通过手动一个一个解决掉,如果有一万个运维怎么办?所以对于运维工单必须引进自动化,这样才能加快运维工作的加快。

因为自动化元素之后,它的逻辑架构相比就多了一层第三方系统,我们做的操作都是通过第三方系统API来实现的,就变成了四层架构。但是因为架构变复杂了,很多东西都面临新的挑战,比如来自于用户的挑战,工单种类特别多,这里是我从线上截取的截图,可以看到我们的工单是分成五大类,每个大类里面有若干个子类,如果说采用全流程开发方式,时间是消耗不起的。第二个挑战是需要自动化处理,处理任务特别多的时候就需要大量调用第三方系统处理掉,但是第三方系统参数如何处理?也是需要把参数拼接起来,才能正常进行第三方API,这就是挑战。

对于开发侧来讲,因为第三方API的参数是非常复杂的,我们是没办法预测它是什么模型,我们就需要把这个模型拼接起来,才能成功地执行第三方的API,这是我接触的第三方API的样例,从它的输入参数来看,这些参数也都是来自不同系统,所以对于开发的同学来讲,怎么把外来的参数正常拼接起来,这是一个非常大的挑战。另外一个挑战就是用户侧需求变化是比较大的,一般情况下,一个流程建起来之后,随着不同的变更和工作内容的变化,处理的内容也是变化的,这种就需要改代码,对开发的同学也是一种挑战。第三就是人不够用。

想解决这种情况,我们怎么去做呢?需要做一个工单系统出来,那我们就需要知道一个工单系统应该包含什么元素?所以这就涉及到系统更新。系统更新的话工单系统都有什么共性?第一个是虚机申请,第二个是物理机申请,可以看到不同的工单系统界面是不一样的,对研发同学来讲,我是不是对每个工单系统都做一个完整的界面,这是一种需要考虑的情况。

第二,我的工单系统界面上需要提供用户录入,用户录入的数据多种多样,对于虚机申请的界面来讲,所在机房的数据是从CMPD拉出来的,这就涉及到数据拼接的过程。对于发布系统,就包括发布目标所在机房和所在机房的逻辑位置以及逻辑位置的区域,这是两个不同的系统,两个不同系统的数据怎么能够呈现出台一套完整的数据,展现在整个界面上,这也是需要考虑的问题。

第三,对于界面操作来讲,用户把工单提交完了之后,需要给下一个人处理,处理过程是通过界面上的按钮来做的,不同按钮中的处理方法也是不一样的,比如这边的装机按钮是人工点的,人工点了之后从待机变成装机状态,对于装机之后,到底是装机成功还是失败?这个状态不是人工去触发的,是第三方系统API做的,这就有另外一种情况,这种情况下我们怎么去处理这个API流转,这也是需要考虑的方面。还有比较特殊的按钮,像添加失败原因,虽然我点了按钮显示操作,但是还是停留在当前状态,比如说装机失败了,我不想把状态变成下一个步骤,只是想知道装机失败的原因,这也是一种因素。这些按钮是执行的人都可以操作还是控制某些人可以执行,这也涉及到安全权限的控制。对于所有的流程来讲,都有一个状态机,基本上这里截取了一个发布系统的状态机,由待发布和发布的时候,然后是发布中,发布中可以根据后面的API执行的结果判断发布成功还是发布失败,每个流程都有一个抽象的状态机的概念在里面。

我调用了第三方系统,第三方系统执行的进度是如何让前端客户看到的,如果是实时反馈的还好,如果是停留的时间比较久,比如我执行了十分钟,任务可能是若干个子任务来一个一个往下反馈的,怎么让用户知道你的系统是正在工作而不是出问题了,所以就需要把后端的状态实时反馈到前端界面,比如说这里截取的进度条,当前发布的进度是6%或者10%,这样大家对新系统有一个比较清晰的认识。

刚刚提到执行发布的时候需要执行第三方API,执行API需要输入正确参数才可以把整个API执行成功,对于这个API来讲,输入参数整个结构是这个概念的,但是具体的参数值是从什么地方来的?怎么能够自动化的把参数值拼装出来,这就考虑到一个挑战。

通过上面的分析,如果我们想做一个工单系统,需要满足上面所有的需要,比如说需要提供一个非常富的API,能够让前端开发拿到这个API都知道界面怎么画出来的。第二,多个数据源拼接,来自不同系统,不同数据库,而且是通过API返回的,怎么拼接为能够让另一个系统识别。还有各种的Atcion,点了按钮之后触发什么动作,触发之后怎么操作的。还有Atcion的权限控制,还有引入状态机,状态机控制工单是怎么流转的。单一表单,方便不同状态间内容同步,这是单一表单的概念。不同的状态机下面,它的状态值可以显示不同的,比如发布的时候,对于单一的表单来讲,怎么让在不同阶段显示不同值,这也是需要考虑的。然后就是系统的实时通信,还有PC的能力。

这就是整理的系统架构,首先是用户层,用户层就是所有的用户,展示层就可以多种多样,既可以让研发人员做具体的页面,也可以拿到API之后,自己画出界面,甚至也可以是APP上的东西拿到API之后。所以展示层就可以定义出来,这就是整个OPSTicket做的事情。总共包括八个模块。第三方系统,如果完成一个任务,是多个第三方系统实现这个任务的,所以通过这层的隔离之后,第三方系统无论是一个系统的API还是多个系统的API,都可以正常执行成功,把结果返回给前端界面。

对于这么多模块之间,是怎么调用的呢?用户的操作首先会反馈到APISet模块,APIset会跟Source、perm、fsm统一协作,如果打开页面,界面上显示一些数据,真正执行atcion,会把请求转为Executor,还有一个trans模块保证第三方API拿到参数。

APISET接受UI页面所有请求,对于Datasourec,是多个数据源的聚合,比如来自CMDB的数据,是一个机房的名称,机房的ID,对于第二种数据来讲,是机房的ID,机房ID里面所包含的IP,这是CMDB的数据。对于用户数据来讲,有机房ID有SET,另外机房还有另外一个SET10,区域类型是CC和DD,这是业务部的数据。如果我们想完成完整界面,这中间包含四个数据,机房名称、机房ID、SET名称和SET类型和机房的IP地址。我们怎么实现选了某个机房,正常显示机房含的SET信息,点了SET之后,怎么显示SET有哪些区域?这就需要通过DATASOURCE,把信息拼接成完整的数据发给前端,前端根据这个数据进行渲染,这就是DATASOURCE的作用。

MeteTicket,一个工单通过填数据之后,是需要不同的值,但是对于原生数据来讲,METETicket是一样的,metaTicket相当于代码层的class。perm模块就是,某个人执行一个action之后是否成功,就需要perm模块,Executor模块是选择调用哪一个API,然后来进行集合成功。另外也是第三方API的集成模块,这和上面的模块区别就是,上面模块是执行一个API的,如果一个任务需要执行多个API,比如想做一个自动化部署,有人批准了你的请求之后,你是点多个按钮还是允许用户只点一个按钮就把所有工作都做掉,如果是后者,就需要用户来编排这么多API,API之间是定型还是串型的,反馈的结果是成功的时候执行哪一个API,里面是有编排概念的,这就是他们之间的区别。

对于paramtrans模块也是有比较复杂的逻辑在里面,比如说组装第三方API,这个参数是我们刚才讲到的怎么把你的第三方API参数拼接成,首先是需要第三方API参数里包含什么信息,比如说这个ID,用户在创建工单的时候,工单的某一个状态反馈到这个结果,这个结果是怎么样把它反馈到界面上,这里标黄的数据就是对应的ID。用户在录入工单的时候,可能输入了IP地址,这些信息是存在数据库里的,而且这些信息依赖于多个表里。第三种情况是,当你真正执行API的时候,点发布,可能会弹出窗提示你,你现在想执行什么,你是直接全部不用经过发布,全部一次性发布成功,还是需要控制比较严格,是需要经过人工确认再进行下一步操作。所以对这三种数据,大家可以看出它的来源是不一样的,第二,存储的表也是不一样的,我们怎么样自动化的把它拼接成这种格式,也是需要paramtrans的模块,把反馈结果定义模板的概念,定模板之后就可以抽样提取出来ID,当我执行这个第三方API的时候,就可以把ID完全传给它。

然后是状态机,控制了工单里面的状态,以及每个状态中是怎么流转的,这是状态机的作用。

另外是Socketserver,是基于websocket实现的,对于plugin,是扩充APISet,当这几个模块,我是一个新的工单,之前都是用户录入的数据,但是这个工单用的数据是直接用表格,这种情况下直接上传的是APIset,需要插件系统,比如丢一个脚本上去,写一个简单的参数,就可以通过插件系统把功能直接应用到你的系统里,这就达到一个快速交付的目的。

既然这个号称是通用系统,到底能不能满足需求?我们就可以通过一个示例来看是怎么工作的,这个示例是线上的装机部署系统的,包括操作系统的安装,交换机的自动配置和控制IP信息的信息管理,涉及到这么多系统。中间截取的一个状态机,待装机到装机中,装机中到装机失败或者到装机成功,待配置vlan,对于这样一个状态机,最终通过系统配置完之后,系统的展示是这样一个界面,我们现在是通过这个系统怎么实现的。

我们只需要做三类事情,第一,我们通过一个配置管理的界面,定义metaTicket,这里面包含了基本信息,包含什么字段,反馈给用户你需要怎么录入。然后是定义状态机,从状态A流转到状态B,我是怎么流转到状态B的。

定义metaTicket需要输入什么信息?第一是需要输入这个工单的名字,就是一个装机部署系统,第二是需要描述信息,比如说是驱动服务器从上架到交付各个环节。我需要提供什么样的信息,一般信息非常多,这里我只截取两个字段来描述一下过程。现在对于IP字段来讲,它是告诉系统,IP字段接受的数据参数类型是string,string是通过第三方API生成的,然后把结果反馈到string。对于装这个机器是处于哪个机房,这个是位置的字段,也是需要定义位置字段也是一个string,string是哪里来的,需要用户录入。通过这么简单配置之后,就可以看清楚当前的工单是做什么的,这个工单里都包含什么数据,这些数据是怎么让用户去录入的,数据来源是什么。

对于工单系统来讲是包含状态机的,对于刚才提到的状态机,怎么去配置生效呢?在这个阶段需要输入包含哪些状态,系统更新之后,你的工装系统包含四个状态,比如待网络配置,待装机,装机中和装机失败,在系统里我用的四种状态,然后备一个组,比如我装机组里,有这三个状态,这个组的意义在于刚看到的结果,就是对应装机的,用户点了装机按钮之后,实际上可以看到处于待装机和装机失败的界面。第三步是定义状态转换,比如现在处于装机中的,什么时候装机成功或者装机失败,我的出事状态是装机中,目标状态是装机成功,触发状态变迁的是API,然后就需要输入API的地址,既然这个API地址就需要对参数进行处理,你需不需要记录下来,记录下来之后,这个值有没有运用到其他状态。然后再定义可执行人,哪些人可以执行触发变迁,最终一个API可能有两个状态,一个是执行成功,一个是执行超时,对于失败和超时都统一认证为失败,如果这个API值是失败的话就是装机失败,如果API值反馈是成功的话,就直接进入装机成功的状态。

我们新接了一个工单的需求,只需要刚才那三步,基本上配置一下必要信息,工单就可以完成。如果说用默认的前端界面,当时就可以使用了,如果前端界面有一个特殊要求,就需要API的反馈值定义界面数据,到用户打开前端数据的时候,这些模块是怎么交互的,因为刚才只是描述怎么配置的,真正去打开界面之后,状态之间是怎么交互,怎么样把界面给画出来的,用户打开了页面什么都没做,前端会提交请求,以APIset的模块,接收到请求之后,会去获取第三方数据,你打开页面之后,你需要用户输一个表单,是通过四机联动的,datasource拉取数据,根据定义的逻辑,比如你定义的模块,把数据到模板里,APIset拿到数据,然后获取状态机的信息,把这些信息拿到之后,就把数据反馈给前端,前端拿到之后根据代码配置把界面画出来,这就是前端界面的交互。

用户需要执行某一个动作,执行动作的时候,这个界面是怎么交互的?比如说点了一个action,接收到这个请求就开始判断你当前的登录用户有没有执行action权限,如果有的话,就允许你进行下一步的操作,如果没有的话,直接返回就没有权限,如果说有这个执行权,第三方参数就需要拼接,因为我们是多个API拼接的,所以就到Uflow模块,就会自动执行刚才定义的API,会判断这些API是执行成功还是失败了,经过处理之后,数据最终返回了Executor,就会来触发本身的状态变迁,是装机成功还是失败的状态。

通过系统使用,我们新接受一个工单请求,基本上没有什么代码开发量,只是配置一下就OK了,无论提供所有的工单需求过来,实际上我们的开发工单的人非常少。第二个优势就是,完全实现了用户看到的前端界面和工单逻辑层和第三方系统是完全独立自治的,采用这种方法来做之后,完全是不需要改代码的,只需要到刚才配置的界面来配置一下API值和模板就可以了。

最终这个系统实行的功能就是进可攻退可守,对于大部分的工单需求来讲,直接可以交给用户使用,如果需求比较奇特,某一个模块之前没有输入或者没有写进去,就需要通过插件系统来扩充模块的功能,最终实现整个系统的交互,所以说进可攻退可守。一个方法不可能满足所有的需求,所以有了这个插件系统,我们就可以保证整个功能是闭环的,就算不能保证所有的,也能通过少量代码保证系统交互。

观众提问wel







































北京哪家白癜风医院好
治疗皮肤病专科医院



转载请注明:http://www.xcqg58.com/zytd/5872.html