信斌 王桂花


摘要:為實時監控設備運行狀態,自動進行設備異常診斷,解決當前企業設備數量不斷增加和人工測試工作量越來越大的問題,設計了基于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]?;赑ython的設備診斷系統包含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個設備節點(刀片式服務器),每個節點都有可能產生異?;蚬收希皶r發現這些故障并查證故障原因是測試工作的重要部分。以往測試工作中,數百個設備由測試工程師手工采集信息并篩選出有效故障,需要耗費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