APP下载

基于Python和Jenkins的设备异常诊断系统设计与实现

2017-12-02信斌王桂花

软件导刊 2017年11期

信斌 王桂花

摘要:为实时监控设备运行状态,自动进行设备异常诊断,解决当前企业设备数量不断增加和人工测试工作量越来越大的问题,设计了基于Python和Jenkins的设备异常自动诊断系统,实现了设备异常诊断监控自动执行,以及故障报告自动生成和推送。该系统利用python语言的开源和可扩展特性,克服了传统测试软件的容量限制,缩短了系统开发时间,提高了系统开发效率。同时,借助Jenkins的定时触发特性,构建了自动化控制系统,克服了人工触发带来的工作量大的弊端,极大提高了测试效率,实现了对测试设备的实时监控。

关键词关键词:Python;Jenkins;设备异常诊断系统;设备监控;自动化

DOIDOI:10.11907/rjdk.172347

中图分类号:TP319

文献标识码:A文章编号文章编号:16727800(2017)011011004

0引言

随着计算机及通讯技术的发展,传统的集中式电路交换网络逐渐被分布式云计算网络所替代。通讯网络正向云计算和虚拟化方向进化,设备运行环境越来越复杂,受外界因素的影响和干扰越来越多,设备故障监控的时效和自动化要求越来越高[12]。设备运行维护和测试对象,由原来的少数大型设备变成了成百上千的刀片式服务器,设备故障监控技术、系统扩容和日常诊断都面临很大挑战[34]。实现设備的实时监控,降低设备异常,减少危害和损失迫在眉睫。

1系统结构与流程

1.1系统结构

通讯设备实验室一般有若干测试环境,每个环境内又有一个控制节点设备和若干计算节点设备。控制节点和

计算节点之间通过局部网络互通,但不同环境之间的计算接点不能互通。故障信息采集终端和所有的控制节点通过网络相连,但不能直接和计算节点连接,即整个组网是一个树状的二级网络,如图1所示。故障采集系统运行在故障采集服务器上,通过控制节点采集设备运行异常日志记录,再进行分析筛选,由Jenkins服务器负责故障采集、分析,并推送分析报告到测试环境负责人。

1.2系统处理流程

系统处理流程:①Jenkins自动定时触发;②程序读取配置文件,进行初始化,采集各通讯设备上的运行日志并保存;③根据异常关键字,用正则表达式匹配方法,分析设备运行日志,找出故障;④将筛选出来的故障信息汇总,生成测试报告,Jenkins回收测试报告,并将其通过邮件发送给相关测试人员。如图2所示。

图2系统处理流程

2系统设计与实现

2.1系统设计

Python是一种面向对象的解释型编程语言,具有开源和可扩展特性[56]。采用Python开发测试系统,有利于提高开发效率,缩短开发时间[79]。基于Python的设备诊断系统包含SSH协议接口、信息采集、日志分析及故障报告生成等模块,借助Jenkins实现整个任务的自动定时调度,并将故障报告推送给相关测试人员。

2.1.1SSH接口处理模块

监控终端需要登录到控制节点服务器(运行Linux操作系统)上,执行异常日志的采集工作。Python的扩展模块Paramiko提供了SSH协议相关的一系列接口,对这些接口进行二次封装,将繁琐的协议函数封装为简单的接口,主要包括交互式执行命令接口、SFTP下载文件接口。SSH接口模块分为以下几个部分:

(1)定义SSH初始化函数:

def __init__(self, hostname,port,username,passwd):

self.ssh=paramiko.SSHClient()

self.ssh.load_system_host_keys()

self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

self.ssh. Connect(hostname,port,username,passwd,timeout=2)

self.sftp=self.ssh.open_sftp()

self.channel=self.ssh.get_transport().open_session()

self.channel.get_pty()

self.channel.invoke_shell()

self.channel.settimeout(20.0)

(2)定义SSH命令执行函数:

def ssh_exec_cmd(self,cmd):

stdin,stdout,stderr=self.ssh.exec_command(cmd)

out=stdout.read()

return out

(3)定义SSH交互式命令执行函数:

def ssh_interactive_command(self,cmdlist):

for cmd in cmdlist:

command=cmd[0]+'\\n'

delaytime=int(cmd[1])

expected=cmd[2]

self.channel.send(command)

time.sleep(delaytime)

outstring=self.channel.recv(65535)

if outstring.find(expected)<0:

return False

return Trueendprint

该函数用来执行人机交互命令。例如登录Linux服务器,在登录过程中,系统会提示用户输入用户名、口令,登录成功后,继续执行其它命令。人工操作时这些交互都不是问题,但在程序自动化处理过程中需要代码识别等交互元素,在正确的时机输入正确的命令字符串。函数通过一个预先定义的列表来传递交互式命令序列,并对上一命令的执行结果和参数定义的预期结果进行比较。只有得到期望结果时才执行下一个命令。一个典型的命令序列参数如下:

cmdlist=[ ('ssh root@129.0.2.1' , 2, "password"),

('my_pass', 2, "~ MYM"),

('cp -f /IDE0/*.* /home/temp123', 2, "~#")]

该列表定义了多个命令序列,每个序列有3个元素,第1个元素是需要执行的命令,第2个参数是执行该命令后等待的时延值(等待系统进行命令处理),第3个参数是该命令执行后期望得到的结果。

(4)定义SFTP文件传输函数:

def download_file_from_remote(self,remotepathfile,localpathfile):

self.sftp.get(remotepathfile,localpathfile)

return

2.1.2控制节点的异常日志信息采集模块

控制节点能够和日志采集服务器直接通讯,可以用SSH模块的SFTP接口直接下载异常日志文件到本地。相应的Python代码 (函数的第1个参数是在初始化阶段已经创建的SSH客户端模块实例,第2个参数指定异常日志文件所在的路径,第3个参数指定异常日志文件拷贝的目的路径) 如下:

def Get_ExcLog_from_control_node(self,ssh_client, exc_log_dir ,local_save_dir):

cmd_out=ssh_client.ssh_exec_cmd('ls ' + exc_log_dir)

if cmd_out is not None and len(cmd_out) !=0:

filename_list=cmd_out.strip().split('\\n')

else:

return

for filename in filename_list:

src_file=exc_log_dir + '/' + filename

dst_file=os.path.join(local_save_dir,filename)

cmd_out=ssh_client.download_file_from_remote(src_file,dst_file)

2.1.3计算节点的异常日志信息采集模块

通过SSH先登录到控制节点,执行Linux远程拷贝命令,将计算节点的异常日志文件拷贝到控制节点的临时目录中,再下载到采集服务器。因为远程拷贝SCP命令在执行过程中需要和用户交互(提示并等待用户输入远程Linux服务器的登录口令),所以需要通过SSH模块的交互式命令接口和预先设计好的命令序列来实现。代码如下:

def Get_ExcLog_from_subnode(self,ssh_client, node_ip, file_list, pass,local_save_dir):

for exc_file in file_list:

cmdlist=[(r"scp root@%s:%s /temp" % (node_ip,exc_file), 3, "password"),

(pass, 5, ""),]

ssh_client.ssh_interactive_command(cmdlist)

self.Get_ExcLog_from_control_node(ssh_client, '/temp', local_save_dir)

2.1.4異常信息分析与故障报告生成模块

将实验室内所有设备的异常日志文件采集到本地后,日志分析模块对这些文件中的异常记录进行筛选,按异常关键字扫描所有文件,判断故障信息(例如异常日志中出现mem leak,则说明出现内存泄漏,出现dead lock说明出现死锁,出现last words说明设备某模块曾经出现过宕机并重启,有留言说明重启原因等),并将这些信息按设备名称、设备负责人、故障发现时间、故障信息简述分类录入数据库中。

故障信息筛选完毕后,由报告生成模块访问数据库,将记录的故障信息按html格式呈现出来。根据报告文件,设备负责人可以对故障设备进行排查,并作出改进。

2.2系统实现

以上系统实现了设备故障信息采集及分析功能,可一次性采集数百台设备的运行日志,并判断其中的故障信息。但工具本身无法自动运行,仍需人工触发。为达到节省人力并持续不断地对实验室设备进行监控的目的,引入Jenkins构建自动化控制系统。

Jenkins广泛应用于通讯及互联网软件开发的持续集成,是一个开源软件,旨在提供一个开放易用的软件平台,用于监控重复工作,其功能包括:①持续的软件版本发布/测试项目;②监控外部调用执行工作[1011]。本系统将开发的设备异常诊断系统作为一种外部调用功能,由Jenkins定时调用,借助Jenkins的定时触发特性,实现设备异常监控自动化执行。另外,Jenkins的邮件推送功能,可将设备异常诊断报告周期性地发送给设备维护负责人,实现“故障发现→报告→故障解决”闭环系统。endprint

3诊断案例

某通讯设备测试实验室共有20套虚拟化测试环境,每套环境部署12个设备节点(刀片式服务器),每个节点都有可能产生异常或故障,及时发现这些故障并查证故障原因是测试工作的重要部分。以往测试工作中,数百个设备由测试工程师手工采集信息并筛选出有效故障,需要耗费1人1天的工作量,因此一般是每周才测试一次。但故障的发生是随机的,发现越早解决问题越及时。实施本系统后,每天可根据需要自动执行多次采集与诊断任务,自动生成测试报告,不仅节省了大量的人力,还极大提高了测试效率,缩短了软件开发和测试周期,如表1所示。

4结语

基于Python和Jenkins的设备异常诊断系统,利用python语言的开源和可扩展特性,克服了传统测试软件的容量限制,提高了系统开发效率。引入Jenkins,借助Jenkins的定时触发特性,构建了自动化控制系统,节约了大量人力,实现设备异常诊断监控的全自动化周期执行,以及故障报告的自动生成和推送,极大提高了测试效率。

参考文献参考文献:

[1]潘传甲.机械设备远程监控与故障诊断系统设计[J].中国设备工程,2017(10):5556.

[2]齐永龙,宋斌,刘道煦.国外自动测试系统发展综述[J].国外电子测量技术,2015(12):14.

[3]步卫丽.通讯设备故障监控系统扩容及其日常维护[J].无线互联科技,2014(8):6970.

[4]胡晓宏.基于图像处理的设备异常检测关键技术方针[J].计算机仿真,2016(1):425429.

[5]MARK LUTZ. Python編程[M].邹晓,译.北京:中国电力出版社,2015.

[6]萨默菲尔德.Python 3程序开发指南[M].王弘博,孙传庆,译.北京:人民邮电出版社,2015.

[7]邵婧,陈左宁,殷红武.面向Python的信息流控制模型及其实现[J].计算机应用研究,2015(10):30653069.

[8]宾俊,艾芳芳,刘念,等.基于Arduino和Python搭建的实时在线pH测量平台[J].计算机与应用化学,2015(4):4852.

[9]蒋崇武,刘斌,王轶辰,等.基于Python的实时嵌入式软件测试脚本[J].计算机工程,2009(15):6466.

[10]周莹,欧中红,李俊.基于Jenkins的持续集成自动部署研究[J].计算机与数字工程,2016(2):267270.

[11]赵杰昌,张良宇.基于Jenkins构建持续集成系统[J].电脑编程技巧与维护,2014(9):910.

责任编辑(责任编辑:杜能钢)endprint