前言
参加了今年5月的甲骨文开发者大会,在大会上看到了智能AI在运维方面的应用场景;讲师展示了一个智能AI,可以结合上下文对话,通过聊天完成运维工作。
会后,我永远不会忘记这个智能AI机器人。由于人工智能AI学习成本较高,不知能否写出一套低调的运维互动机器人;
思考
最初,机器人被期望:
通过手机处理简单的故障并不智能,但至少可以灵活改变配置。有了具体的目标,再考虑具体的实施方案,主要思考几点:
应用载体
我期待这个载体是一个常用的手机APP在现有环境下,微信企业号适合这个任务,官网有各种API文档,实现起来不是很大的挑战。
安全
说到运维平台,控制运维平台相当于控制所有服务器;因此,运维平台相关的安全问题不容忽视。需要保证交互过程中的安全性,这就需要对不可信的服务器进行加密和策略控制。
灵活性
可以通过配置文件的方式进行配置,可以随着功能模块的增加随时更改。考虑到配置文件的使用方式可能过于单一,花哨的功能可能无法满足实现的要求,在配置管理上尽量考虑可以花哨灵活的方案。
对话上下文
一般来说,通信需要较长的连接,以保证通信过程中双方都能收发数据包;考虑到一个对话需要一个特殊的线程来进行交流,不仅增加了开发的难度,也消耗了更多的资源。权衡利弊后,我们尝试选择非实时解决方案进行上下文管理。
体系结构
列举了几个思考要点后,我对整体设计进行了深入思考。几经思考,
采用微信企业号作为应用载体
关于企业发展与传送门。加强安全
接口平台只允许腾讯服务器IP访问。运维平台开放接口平台白名单访问,使用Python itsdangerous生成安全令牌进行通信和交互。编程思想
采用树形结构设计模式,每一个分支都是一个功能,不用担心无法完成花里胡哨的操作,可以灵活变化,持久存储收到的信息
存储每个用户发送的信息,并做出快速响应。Redis非常适合这种场景,可以存储信息,效率非常高。架构图如下所示。
实现
接收企业号信息的API代码片段显示
#引用企业微信JDK自wxcrypt.wxbizmsgcrypt导入wxbizmsgcryptdef work _ weixin _ API(request): #获取微信Post参数msg _ signature=request . Get . Get(' msg _ signature ',' ')timestamp=request . Get . Get(' timestamp ',' ')nonce=request.get.get ('nonce ',)echostr=request . Get . Get(' echostr ',' ')#构造微信信息解析方法wxcpt=wxbiztPOST.get('eagle_branch ',Master ')如果eagle _ branch==' Master ' : Request _ data=Request . body #解析接收到的文本ret,msg=wxcpt .解密msg (request _ data,msg _ signature,timestamp,Nonce) Request _ XML=et。从字符串(消息)#获取信息内容内容=请求XML。查找('内容')。文本#获取信息类型msg _ type=Request _ XML。查找(' msgtype ')。文本#从_ user=request _ XML . find(' from username ')获取发件人的安全令牌生成。text else : content=request . post . get(' content ','')from _ user=request . post . get(' from _ user ',' ')
# encrypt def enc _ dict(d): # encrypt s=urlsaveserializer(' 1234 ')ST=s . dumps(d)# encrypt然后基于时间戳生成令牌t=timestampsigner(' 4567 ')ts=t . sign(ST)return ts功能树设计代码片段show
首先定义一个功能树基类
# 菜单功能的基类类函数: def _ _ init _ _(self,data): self ._数据=数据自身。_函数=[] #传入的方法的描述def __str__(自):返回字符串(自我._data()) #返回当前对象类型def f_type(自我):返回自我_data.f_type #返回当前对象def getData(self):返回自我._数据#返回所有子菜单def getFunctions(self):返回自我._函数#新增子菜单def add(自我,功能):自我_functions.append(function) #递归搜索def go(self,num): for _,i in enumerate(self ._函数):如果int(num)==_ :返回,则返回没有人由于是在手机上操作,那么交互内容尽可能简单,所以采用全数字交互方式。在树结构设计模式下,所有操作都是在递归搜寻,对于其他特殊的输入,例如端口确认验证码之类的无法实现。
在这里需要有小小的改动
# 新增一个类型属性def f_type(自我):返回自我_data.f_type #递归搜索def go(self,num): for _,i in enumerate(self .函数): f_type=i._data().f_type #如果类型是默认且存在列表中,或动态生成类型的,直接返回如果f_type=='默认'和int(num)=_或f_type=='动态' :我返回无
接着,编写一个功能树的类
课程菜单: def _ _ init _ _(自我):自我._ head=Function(FunctionNodeBase())self。输入文本=无#链接def linkToHead(自我,功能): self ._head.add(函数)#搜索极好的搜索(自我,文本): cur=自我。如果cur . go(I)=None :返回没有别人:自我。input _ text=I cur=cur。去(我)返回坏蛋叶子跟树的主体都有了,下面来创建树顶
展示:基础功能叶动态功能叶静态功能叶
# 空的功能节点类函数nodebase : _ _元类_ _=abcdame def _ _ init _ _(self,user=None,f_type='default ',input_text=None,sub _ text=None): self。用户=用户。子文本=子文本自身。输入文本=输入文本。f _ type=f _ type。f _ mark=[]#菜单通过奔跑方法执行与生成文本@抽象方法def run(self):返回自我._ _ str _ _(#)描述@抽象方法def _ _ str _ _(self): return '菜单树顶层'# 动态生成类选择部署选项(功能节点库): #动态生成的菜单需要声明f _ type def _ _ init _ _(self): super()._ _ init _ _()self。f _ type=' dynamic ' def run(self): text='请选择事业部 n n ' deployment _ list=[I代表函数列表中的I。keys()]for _,I in enumerate(deployment _ list): self。f _ mark。追加(_)文本=' % s % s n ' %(_,I)返回文本#微信显示的文本信息def __str__(self): return '选择事业部'# 静态类MySQL function top(FunctionNodeBase): def _ _ init _ _(self): super()._ _ init _ _()def run(self): text='您选择的是%s,请选择您想要操作: n“% str(self ._ _ str _ _())文本=' % s n ' % self。sub _ text返回text def _ _ str _ _(self):返回' MySQL操作'效果图,第一层功能展示
将需要的功能逐一写好后需要进行注册
def api(tid,用户): #实例化Menu=Menu()top=Function(SelectDeploymentTop)Function _ top=Function(Function top)MySQL _ top=Function(MySQL Function top)#链接顶部。add(function _ top function _ top。添加(MySQL _ top)#关联菜单树menu.linkToHead(顶部)#递归搜索function=menu.search(tid)Redis存储对话代码片段
class redis _ db : def _ _ init _ _(self): #按符号隔开自我。马克='-'自我。redis _ db=redis .StrictRedis(主机=主机,端口=6379,db=1,decode_responses=True) #默认回话过期600秒,每次存储'-'隔开def add(自身、键、文本、超时=600):如果键不在自我。keys(): self。redis _ db。设置(键' ',例如=超时)如果自我。get(key): self。redis _ db。追加(键,自身。马克)自我。redis _ db。追加(键、文本)同理,返回上层就删除一格;退出即删除该键的值。
成果
下图展示了通过连接k8s和交互式机器人来增加PODs数量的应用场景
附言
该系统在平台上稳定运行半年多,使运维人员能够更高效、更快速地解决一些日常故障。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。