信斌 王桂花
摘要:為實(shí)時(shí)監(jiān)控設(shè)備運(yùn)行狀態(tài),自動(dòng)進(jìn)行設(shè)備異常診斷,解決當(dāng)前企業(yè)設(shè)備數(shù)量不斷增加和人工測(cè)試工作量越來越大的問題,設(shè)計(jì)了基于Python和Jenkins的設(shè)備異常自動(dòng)診斷系統(tǒng),實(shí)現(xiàn)了設(shè)備異常診斷監(jiān)控自動(dòng)執(zhí)行,以及故障報(bào)告自動(dòng)生成和推送。該系統(tǒng)利用python語言的開源和可擴(kuò)展特性,克服了傳統(tǒng)測(cè)試軟件的容量限制,縮短了系統(tǒng)開發(fā)時(shí)間,提高了系統(tǒng)開發(fā)效率。同時(shí),借助Jenkins的定時(shí)觸發(fā)特性,構(gòu)建了自動(dòng)化控制系統(tǒng),克服了人工觸發(fā)帶來的工作量大的弊端,極大提高了測(cè)試效率,實(shí)現(xiàn)了對(duì)測(cè)試設(shè)備的實(shí)時(shí)監(jiān)控。
關(guān)鍵詞關(guān)鍵詞:Python;Jenkins;設(shè)備異常診斷系統(tǒng);設(shè)備監(jiān)控;自動(dòng)化
DOIDOI:10.11907/rjdk.172347
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2017)011011004
0引言
隨著計(jì)算機(jī)及通訊技術(shù)的發(fā)展,傳統(tǒng)的集中式電路交換網(wǎng)絡(luò)逐漸被分布式云計(jì)算網(wǎng)絡(luò)所替代。通訊網(wǎng)絡(luò)正向云計(jì)算和虛擬化方向進(jìn)化,設(shè)備運(yùn)行環(huán)境越來越復(fù)雜,受外界因素的影響和干擾越來越多,設(shè)備故障監(jiān)控的時(shí)效和自動(dòng)化要求越來越高[12]。設(shè)備運(yùn)行維護(hù)和測(cè)試對(duì)象,由原來的少數(shù)大型設(shè)備變成了成百上千的刀片式服務(wù)器,設(shè)備故障監(jiān)控技術(shù)、系統(tǒng)擴(kuò)容和日常診斷都面臨很大挑戰(zhàn)[34]。實(shí)現(xiàn)設(shè)備的實(shí)時(shí)監(jiān)控,降低設(shè)備異常,減少危害和損失迫在眉睫。
1系統(tǒng)結(jié)構(gòu)與流程
1.1系統(tǒng)結(jié)構(gòu)
通訊設(shè)備實(shí)驗(yàn)室一般有若干測(cè)試環(huán)境,每個(gè)環(huán)境內(nèi)又有一個(gè)控制節(jié)點(diǎn)設(shè)備和若干計(jì)算節(jié)點(diǎn)設(shè)備??刂乒?jié)點(diǎn)和
計(jì)算節(jié)點(diǎn)之間通過局部網(wǎng)絡(luò)互通,但不同環(huán)境之間的計(jì)算接點(diǎn)不能互通。故障信息采集終端和所有的控制節(jié)點(diǎn)通過網(wǎng)絡(luò)相連,但不能直接和計(jì)算節(jié)點(diǎn)連接,即整個(gè)組網(wǎng)是一個(gè)樹狀的二級(jí)網(wǎng)絡(luò),如圖1所示。故障采集系統(tǒng)運(yùn)行在故障采集服務(wù)器上,通過控制節(jié)點(diǎn)采集設(shè)備運(yùn)行異常日志記錄,再進(jìn)行分析篩選,由Jenkins服務(wù)器負(fù)責(zé)故障采集、分析,并推送分析報(bào)告到測(cè)試環(huán)境負(fù)責(zé)人。
1.2系統(tǒng)處理流程
系統(tǒng)處理流程:①Jenkins自動(dòng)定時(shí)觸發(fā);②程序讀取配置文件,進(jìn)行初始化,采集各通訊設(shè)備上的運(yùn)行日志并保存;③根據(jù)異常關(guān)鍵字,用正則表達(dá)式匹配方法,分析設(shè)備運(yùn)行日志,找出故障;④將篩選出來的故障信息匯總,生成測(cè)試報(bào)告,Jenkins回收測(cè)試報(bào)告,并將其通過郵件發(fā)送給相關(guān)測(cè)試人員。如圖2所示。
圖2系統(tǒng)處理流程
2系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
2.1系統(tǒng)設(shè)計(jì)
Python是一種面向?qū)ο蟮慕忉屝途幊陶Z言,具有開源和可擴(kuò)展特性[56]。采用Python開發(fā)測(cè)試系統(tǒng),有利于提高開發(fā)效率,縮短開發(fā)時(shí)間[79]?;赑ython的設(shè)備診斷系統(tǒng)包含SSH協(xié)議接口、信息采集、日志分析及故障報(bào)告生成等模塊,借助Jenkins實(shí)現(xiàn)整個(gè)任務(wù)的自動(dòng)定時(shí)調(diào)度,并將故障報(bào)告推送給相關(guān)測(cè)試人員。
2.1.1SSH接口處理模塊
監(jiān)控終端需要登錄到控制節(jié)點(diǎn)服務(wù)器(運(yùn)行Linux操作系統(tǒng))上,執(zhí)行異常日志的采集工作。Python的擴(kuò)展模塊Paramiko提供了SSH協(xié)議相關(guān)的一系列接口,對(duì)這些接口進(jìn)行二次封裝,將繁瑣的協(xié)議函數(shù)封裝為簡(jiǎn)單的接口,主要包括交互式執(zhí)行命令接口、SFTP下載文件接口。SSH接口模塊分為以下幾個(gè)部分:
(1)定義SSH初始化函數(shù):
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命令執(zhí)行函數(shù):
def ssh_exec_cmd(self,cmd):
stdin,stdout,stderr=self.ssh.exec_command(cmd)
out=stdout.read()
return out
(3)定義SSH交互式命令執(zhí)行函數(shù):
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
該函數(shù)用來執(zhí)行人機(jī)交互命令。例如登錄Linux服務(wù)器,在登錄過程中,系統(tǒng)會(huì)提示用戶輸入用戶名、口令,登錄成功后,繼續(xù)執(zhí)行其它命令。人工操作時(shí)這些交互都不是問題,但在程序自動(dòng)化處理過程中需要代碼識(shí)別等交互元素,在正確的時(shí)機(jī)輸入正確的命令字符串。函數(shù)通過一個(gè)預(yù)先定義的列表來傳遞交互式命令序列,并對(duì)上一命令的執(zhí)行結(jié)果和參數(shù)定義的預(yù)期結(jié)果進(jìn)行比較。只有得到期望結(jié)果時(shí)才執(zhí)行下一個(gè)命令。一個(gè)典型的命令序列參數(shù)如下:
cmdlist=[ ('ssh root@129.0.2.1' , 2, "password"),
('my_pass', 2, "~ MYM"),
('cp -f /IDE0/*.* /home/temp123', 2, "~#")]
該列表定義了多個(gè)命令序列,每個(gè)序列有3個(gè)元素,第1個(gè)元素是需要執(zhí)行的命令,第2個(gè)參數(shù)是執(zhí)行該命令后等待的時(shí)延值(等待系統(tǒng)進(jìn)行命令處理),第3個(gè)參數(shù)是該命令執(zhí)行后期望得到的結(jié)果。
(4)定義SFTP文件傳輸函數(shù):
def download_file_from_remote(self,remotepathfile,localpathfile):
self.sftp.get(remotepathfile,localpathfile)
return
2.1.2控制節(jié)點(diǎn)的異常日志信息采集模塊
控制節(jié)點(diǎn)能夠和日志采集服務(wù)器直接通訊,可以用SSH模塊的SFTP接口直接下載異常日志文件到本地。相應(yīng)的Python代碼 (函數(shù)的第1個(gè)參數(shù)是在初始化階段已經(jīng)創(chuàng)建的SSH客戶端模塊實(shí)例,第2個(gè)參數(shù)指定異常日志文件所在的路徑,第3個(gè)參數(shù)指定異常日志文件拷貝的目的路徑) 如下:
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計(jì)算節(jié)點(diǎn)的異常日志信息采集模塊
通過SSH先登錄到控制節(jié)點(diǎn),執(zhí)行Linux遠(yuǎn)程拷貝命令,將計(jì)算節(jié)點(diǎn)的異常日志文件拷貝到控制節(jié)點(diǎn)的臨時(shí)目錄中,再下載到采集服務(wù)器。因?yàn)檫h(yuǎn)程拷貝SCP命令在執(zhí)行過程中需要和用戶交互(提示并等待用戶輸入遠(yuǎn)程Linux服務(wù)器的登錄口令),所以需要通過SSH模塊的交互式命令接口和預(yù)先設(shè)計(jì)好的命令序列來實(shí)現(xiàn)。代碼如下:
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異常信息分析與故障報(bào)告生成模塊
將實(shí)驗(yàn)室內(nèi)所有設(shè)備的異常日志文件采集到本地后,日志分析模塊對(duì)這些文件中的異常記錄進(jìn)行篩選,按異常關(guān)鍵字掃描所有文件,判斷故障信息(例如異常日志中出現(xiàn)mem leak,則說明出現(xiàn)內(nèi)存泄漏,出現(xiàn)dead lock說明出現(xiàn)死鎖,出現(xiàn)last words說明設(shè)備某模塊曾經(jīng)出現(xiàn)過宕機(jī)并重啟,有留言說明重啟原因等),并將這些信息按設(shè)備名稱、設(shè)備負(fù)責(zé)人、故障發(fā)現(xiàn)時(shí)間、故障信息簡(jiǎn)述分類錄入數(shù)據(jù)庫(kù)中。
故障信息篩選完畢后,由報(bào)告生成模塊訪問數(shù)據(jù)庫(kù),將記錄的故障信息按html格式呈現(xiàn)出來。根據(jù)報(bào)告文件,設(shè)備負(fù)責(zé)人可以對(duì)故障設(shè)備進(jìn)行排查,并作出改進(jìn)。
2.2系統(tǒng)實(shí)現(xiàn)
以上系統(tǒng)實(shí)現(xiàn)了設(shè)備故障信息采集及分析功能,可一次性采集數(shù)百臺(tái)設(shè)備的運(yùn)行日志,并判斷其中的故障信息。但工具本身無法自動(dòng)運(yùn)行,仍需人工觸發(fā)。為達(dá)到節(jié)省人力并持續(xù)不斷地對(duì)實(shí)驗(yàn)室設(shè)備進(jìn)行監(jiān)控的目的,引入Jenkins構(gòu)建自動(dòng)化控制系統(tǒng)。
Jenkins廣泛應(yīng)用于通訊及互聯(lián)網(wǎng)軟件開發(fā)的持續(xù)集成,是一個(gè)開源軟件,旨在提供一個(gè)開放易用的軟件平臺(tái),用于監(jiān)控重復(fù)工作,其功能包括:①持續(xù)的軟件版本發(fā)布/測(cè)試項(xiàng)目;②監(jiān)控外部調(diào)用執(zhí)行工作[1011]。本系統(tǒng)將開發(fā)的設(shè)備異常診斷系統(tǒng)作為一種外部調(diào)用功能,由Jenkins定時(shí)調(diào)用,借助Jenkins的定時(shí)觸發(fā)特性,實(shí)現(xiàn)設(shè)備異常監(jiān)控自動(dòng)化執(zhí)行。另外,Jenkins的郵件推送功能,可將設(shè)備異常診斷報(bào)告周期性地發(fā)送給設(shè)備維護(hù)負(fù)責(zé)人,實(shí)現(xiàn)“故障發(fā)現(xiàn)→報(bào)告→故障解決”閉環(huán)系統(tǒng)。endprint
3診斷案例
某通訊設(shè)備測(cè)試實(shí)驗(yàn)室共有20套虛擬化測(cè)試環(huán)境,每套環(huán)境部署12個(gè)設(shè)備節(jié)點(diǎn)(刀片式服務(wù)器),每個(gè)節(jié)點(diǎn)都有可能產(chǎn)生異?;蚬收?,及時(shí)發(fā)現(xiàn)這些故障并查證故障原因是測(cè)試工作的重要部分。以往測(cè)試工作中,數(shù)百個(gè)設(shè)備由測(cè)試工程師手工采集信息并篩選出有效故障,需要耗費(fèi)1人1天的工作量,因此一般是每周才測(cè)試一次。但故障的發(fā)生是隨機(jī)的,發(fā)現(xiàn)越早解決問題越及時(shí)。實(shí)施本系統(tǒng)后,每天可根據(jù)需要自動(dòng)執(zhí)行多次采集與診斷任務(wù),自動(dòng)生成測(cè)試報(bào)告,不僅節(jié)省了大量的人力,還極大提高了測(cè)試效率,縮短了軟件開發(fā)和測(cè)試周期,如表1所示。
4結(jié)語
基于Python和Jenkins的設(shè)備異常診斷系統(tǒng),利用python語言的開源和可擴(kuò)展特性,克服了傳統(tǒng)測(cè)試軟件的容量限制,提高了系統(tǒng)開發(fā)效率。引入Jenkins,借助Jenkins的定時(shí)觸發(fā)特性,構(gòu)建了自動(dòng)化控制系統(tǒng),節(jié)約了大量人力,實(shí)現(xiàn)設(shè)備異常診斷監(jiān)控的全自動(dòng)化周期執(zhí)行,以及故障報(bào)告的自動(dòng)生成和推送,極大提高了測(cè)試效率。
參考文獻(xiàn)參考文獻(xiàn):
[1]潘傳甲.機(jī)械設(shè)備遠(yuǎn)程監(jiān)控與故障診斷系統(tǒng)設(shè)計(jì)[J].中國(guó)設(shè)備工程,2017(10):5556.
[2]齊永龍,宋斌,劉道煦.國(guó)外自動(dòng)測(cè)試系統(tǒng)發(fā)展綜述[J].國(guó)外電子測(cè)量技術(shù),2015(12):14.
[3]步衛(wèi)麗.通訊設(shè)備故障監(jiān)控系統(tǒng)擴(kuò)容及其日常維護(hù)[J].無線互聯(lián)科技,2014(8):6970.
[4]胡曉宏.基于圖像處理的設(shè)備異常檢測(cè)關(guān)鍵技術(shù)方針[J].計(jì)算機(jī)仿真,2016(1):425429.
[5]MARK LUTZ. Python編程[M].鄒曉,譯.北京:中國(guó)電力出版社,2015.
[6]薩默菲爾德.Python 3程序開發(fā)指南[M].王弘博,孫傳慶,譯.北京:人民郵電出版社,2015.
[7]邵婧,陳左寧,殷紅武.面向Python的信息流控制模型及其實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2015(10):30653069.
[8]賓俊,艾芳芳,劉念,等.基于Arduino和Python搭建的實(shí)時(shí)在線pH測(cè)量平臺(tái)[J].計(jì)算機(jī)與應(yīng)用化學(xué),2015(4):4852.
[9]蔣崇武,劉斌,王軼辰,等.基于Python的實(shí)時(shí)嵌入式軟件測(cè)試腳本[J].計(jì)算機(jī)工程,2009(15):6466.
[10]周瑩,歐中紅,李俊.基于Jenkins的持續(xù)集成自動(dòng)部署研究[J].計(jì)算機(jī)與數(shù)字工程,2016(2):267270.
[11]趙杰昌,張良宇.基于Jenkins構(gòu)建持續(xù)集成系統(tǒng)[J].電腦編程技巧與維護(hù),2014(9):910.
責(zé)任編輯(責(zé)任編輯:杜能鋼)endprint