运维:windows+python+route的一次相遇
??? 自言自語
????作為一名網(wǎng)絡(luò)運(yùn)維工程師,自從接觸了linux就被腳本語言所著迷。從Shell到j(luò)ava到expect再到python,慢慢的變得習(xí)慣用寫運(yùn)維工具的方式來解決日常運(yùn)維問題。
????本次寫的運(yùn)維工具讓我get到了很多新技能,覺得很有必要把思緒、過程詳細(xì)的記錄下來,以便日后回顧復(fù)習(xí)。該工具其實(shí)就是一個在windows上用來檢測路由的python程序。我是python小菜雞,請各路大神多指教!
??? 功能說明:
??? 每天凌晨4點(diǎn)從遠(yuǎn)端服務(wù)器獲取指定的調(diào)度域名列表,對調(diào)度域名逐個進(jìn)行解析。對解析結(jié)果中的每個IP進(jìn)行tracert路徑跟蹤。若路徑中未經(jīng)過指定出口節(jié)點(diǎn),則判定為檢測失敗。將檢測失敗的域名對應(yīng)的IP寫進(jìn)郵件正文。若郵件正文內(nèi)容不為空,代表有檢測到失敗的域名,發(fā)送郵件到指定運(yùn)維人員郵箱。
?? ???
??? 實(shí)現(xiàn)思路:
??? 1、linux中要實(shí)現(xiàn)每天凌晨4點(diǎn)執(zhí)行一個程序,使用contab會很方便。但在windows系統(tǒng)要實(shí)現(xiàn)定期執(zhí)行,就要用到windows自帶的任務(wù)與計劃(讓程序每執(zhí)行一次,休眠24小時也能實(shí)現(xiàn),但效果肯定沒任務(wù)與計劃好和靈活);
??? 2、利用wget方式從遠(yuǎn)端服務(wù)器獲取調(diào)度域名列表(感覺wget比ftp\tftp要來的更強(qiáng)大一丁丁),剩下的解析、檢測、發(fā)送郵件等用python腳本實(shí)現(xiàn)。選擇python是因?yàn)閜ython腳本也可以在linux系統(tǒng)上使用方便后期調(diào)整。(感覺cygwin運(yùn)行shell腳本或java都沒有python來的方便);
實(shí)現(xiàn)過程:
????1、在遠(yuǎn)端服務(wù)器1.1.1.1上放好指定調(diào)度域名列表,開啟Apache服務(wù)
[root@keerhe?~]#?cat?/var/www/html/diaodu.txt? data.video.qiyi.com g3.letv.com k.youku.com pl.youku.com data.vod.itc.cn v2.tudou.com ips.ifeng.com v.iask.com wtv.v.iask.com vv.video.qq.com zb.v.qq.com????2、利用python獲取調(diào)度域名列表,并完成解析、檢測等一系列功能
#?coding:utf-8"""文檔說明: 該軟件用于調(diào)度自動檢測 1、從服務(wù)器wget調(diào)度域名列表文件 2、從文件中讀取調(diào)度域名并逐個tracert 3、判斷tracert結(jié)果,若路徑中包含30.207.4.250表示調(diào)度正常 4、若不正常,觸發(fā)告警,發(fā)出告警郵件 5、在windows的任務(wù)與計劃中,每天定期執(zhí)行python腳本 6、運(yùn)行日志直接輸出在cmd窗口(可選) """ #-----重要:將'節(jié)點(diǎn)名稱'改成相應(yīng)的節(jié)點(diǎn)名稱,如nap='河北'#----------導(dǎo)入模塊----------- import?smtplib import?subprocess,re from?email.mime.text?import?MIMEText#----------郵件發(fā)送函數(shù)----------- def?sendmail():????????????#定義發(fā)送郵件的函數(shù)nap='貴州'????????#給本機(jī)定義個名稱,用以收件人區(qū)分郵件由哪個測試機(jī)發(fā)出sender='IpTracker2<xxxxx@163.com>'???#發(fā)件人昵稱及郵箱地址receivers=['yunwei1@watone.com.cn','yunwei2@watone.com.cn','yunwei3@watone.com.cn']subject=nap+'調(diào)度檢測發(fā)現(xiàn)異常!!!'????????#郵件標(biāo)題????smtpserver='smtp.163.com'????????????????#發(fā)件人郵箱smtp服務(wù)器設(shè)置username='xxxxxx@163.com'????????#發(fā)件人郵箱賬號password='123456'????????????????#發(fā)件人郵箱密碼content="\n".join(detected)????????#列表detected中每個元素以回車分割,返回一個字符串print?('異常內(nèi)容是:'+content)????????#將content內(nèi)容打印msg=MIMEText(content,'text','utf-8')msg['Subject']=subjectmsg['to']=';'.join(receivers)????????#列表receivers元素以分號分隔msg['from']=sendersmtp=smtplib.SMTP()smtp.connect('smtp.163.com')smtp.login(username,password)smtp.sendmail(sender,recivers,msg.as_string())smtp.close()#----------獲取調(diào)度域名文件----------- #下載日志記錄于wgetlog.txt中,下載文件保存于c:/Python34,以diaodu.txt命令print?("開始獲取文件") subprocess.call('wget?-a?wgetlog.txt?-O?diaodu.txt?-P?c:\Python34?http://1.1.1.1/diaodu.txt') print?("文件已更新")#----------解析調(diào)度域名,獲取調(diào)度IP---------- r_getip=r'\d+\.+\d+\.+\d+\.+\d+'????#定義過濾IP地址的正則表達(dá)式file=open("c:\Python34\diaodu.txt")????????#打開文件 file.seek(0,0)????????????#設(shè)置指針到行首 r_watone=r'30.207.4.250|30.207.6.154|10.30.96.10'???#定義指定出口的正則表達(dá)式 detected=[] count=1 for?name?in?file:????????#遍歷調(diào)度域名列表name=name.strip('\n')????????#去除域名后面的\n符號,防止解析錯誤resolve=subprocess.getoutput('nslookup?'+name)????#解析調(diào)度域名,將結(jié)果保存在resolvetrack_ip=re.findall(r_getip,resolve)????track_ip.pop(0)????????#過濾出resolve中所有的IP地址,并刪除第一個IP(第一個IP是DNS地址)print?(name+'解析成功,IP是:')print?(track_ip)print?('開始對這些IP進(jìn)行逐個檢測,請耐心等候.........') #---------跟蹤調(diào)度IP并進(jìn)行判斷---------for?ip?in?track_ip:????????#對解析出來的IP遍歷traceroute=subprocess.getoutput('tracert?-d?'+ip)????#保存路徑跟蹤結(jié)果find=re.findall(r_watone,traceroute)????if?len(find)==0:????????#在路徑中搜索出口IP并放入列表find,若長度為0代表沒從出口走detected.append(name+"對應(yīng)IP:"+ip+"檢測失敗!")#將檢測到域名及IP放入列表detected中print?("第"+str(count)+"個域名檢測結(jié)束!")count+=1???????#-----異常信息整理并發(fā)送告警郵件--------- try:if?len(detected)!=0:????#若detected列表長度不為0,代表有域名及IP被寫入print?("有發(fā)現(xiàn)")sendmail()????????????#發(fā)送告警郵件print?("郵件已發(fā)送!")else:print?("本次沒有發(fā)現(xiàn)異常") except?Exception:print?("程序有異常") finally:close=file.close()????????#關(guān)閉文件 if?close?is?None:print?("文件關(guān)閉成功,檢測結(jié)束!")????#確認(rèn)文件關(guān)閉成功 else:print?("文件關(guān)閉失敗,請檢查!")????3、為保護(hù)文件不被別人誤修改,加快腳本執(zhí)行速度,對python腳本進(jìn)行編譯。將編譯后的PYC文件拷貝到c:/Python34目錄下,名字改為Iptracker2.pyc
>>>?import?py_compile >>>?py_compile.compile('c:/Python34/IpTracker2.py') 'c:/Python34\\__pycache__\\IpTracker2.cpython-34.pyc' >>>????4、將wget.exe拷貝到c:/Python34目錄,并創(chuàng)建批處理文件auto.bat,方便后面創(chuàng)建任務(wù)與計劃。用記事本打開auto.bat,寫入:
cd?c:/Python34 python?C:\Python34\IpTracker2.pyc????5、創(chuàng)建任務(wù)與計劃,打開控制面板--管理工具--任務(wù)與計劃
????①、? 點(diǎn)擊頁面右上方‘創(chuàng)建任務(wù)’
????
????②、填寫任務(wù)名稱并選擇無論用戶是否登錄均執(zhí)行(該種方式運(yùn)行不會彈出cmd界面,直接后臺運(yùn)行)
????④、新建觸發(fā)器,選擇每天凌晨4點(diǎn)為觸發(fā)條件
????⑤、創(chuàng)建動作,執(zhí)行批處理腳本auto.bat
????⑥、在設(shè)置中將以下兩個打勾,防止任務(wù)執(zhí)行失敗。點(diǎn)擊確認(rèn),輸入windows密碼點(diǎn)擊確認(rèn)
????⑦、在任務(wù)列表中查看任務(wù)IpTracker2狀態(tài)為就緒,說明創(chuàng)建成功
?成果展示,告警郵件內(nèi)容:
????
????
轉(zhuǎn)載于:https://blog.51cto.com/nihou/1734392
總結(jié)
以上是生活随笔為你收集整理的运维:windows+python+route的一次相遇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA Builder模式构建MAP/
- 下一篇: 初步解读Golang中的接口相关编写方法