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