Python自动化运维技术与最佳实现
?
第一章 系統(tǒng)基礎信息模塊詳解
? 系統(tǒng)基礎信息采集模塊最為監(jiān)控模塊的重要組成部分,能夠幫助運維人員了解當前系統(tǒng)的健康程度,同時也是衡量業(yè)務的服務質(zhì)量的依據(jù),比如系統(tǒng)資源吃緊,會直接影響業(yè)務的質(zhì)量以及用戶的體驗,另外獲取設備的流量信息,也可以讓運維人員更好地評估帶寬、設備資源是否應該擴容。
? 本章通過具體的實例來幫助讀者學習、理解并掌握。在本章接下來的內(nèi)容中,可以通過運用Python第三方系統(tǒng)基礎模塊,獲取服務關(guān)鍵運營指標數(shù)據(jù),其中包括Linux基本性能、塊設備、網(wǎng)卡接口、系統(tǒng)信息、網(wǎng)絡地址庫等信息。當采集到在這些信息后,可以全方位的了解系統(tǒng)服務的狀態(tài),結(jié)合告警機制,可以在第一時間響應,將異常剛剛出現(xiàn)時得以及時的處理。
以下實例都是在一個連續(xù)的Python=交互環(huán)境中進行。
1.1 系統(tǒng)性能信息模塊psutil
? psutil是一個跨平臺庫,可以輕松地實現(xiàn)獲取系統(tǒng)運行的進程和系統(tǒng)利用率其中包括CPU、內(nèi)存、硬盤、網(wǎng)絡信息等。主要用于系統(tǒng)監(jiān)控,分析和限制系統(tǒng)資源以及進程的管理。
? 支持的命令包括:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskst、pmap等。
? 通常獲取系統(tǒng)信息采用編寫shell來實現(xiàn),如獲取當前物理機的內(nèi)存總大小以及使用大小,shell命令
total: free -m | grep Mem | awk ‘{print $2}’
used: ?free -m | grep Mem | awk ‘{print $3}’
? 使用psutil庫實現(xiàn)就更加簡單明了。psutil大小單位采用的是字節(jié),實例如下圖:
源碼安裝:
1.1.1 獲取系統(tǒng)性能信息
? psutil已經(jīng)封裝了獲取系統(tǒng)性能信息的方法,可以根據(jù)用戶的應用場景,來調(diào)用相應的方法媽祖用戶需求。
(1)CPU信息
?linux中的cpu利用率包括以下幾部分:
User Time 執(zhí)行用戶進程的時間百分比
System Time 執(zhí)行內(nèi)核進程和中斷的時間百分比
Wait IO 由于IO等待而使CPU處于idle(空閑)狀態(tài)的時間百分比
Idle Cpu處于空心狀態(tài)的時間百分比
? 使用psutil.cpu_times()方法可以非常簡單的得到信息,同時獲取CPU的硬件信息,比如CPU的物理個數(shù)與邏輯個數(shù),如下圖:
使用psutil.cpu_times()獲取cpu完整信息,需要顯示所有邏輯CPU信息,指定方法變量percpu=True,例如psutil.cpu_times(percpu=True)。
獲取單項數(shù)據(jù)信息,用戶user的CPU時間比
(2)內(nèi)存信息
? Linux操作系統(tǒng)中的內(nèi)存利用率包括total(內(nèi)存總數(shù)),used(已使用的內(nèi)存數(shù)),free(空閑內(nèi)存數(shù)),buffers(緩沖使用數(shù)),cache(緩存使用數(shù)),swap(交換分區(qū)使用數(shù))等等。分別使用 ?psutil.virtual_memory()和psutil.swap_memory()方法獲取這些信息。詳細操作如下圖:
(3) 磁盤信息
? 在系統(tǒng)地所有磁盤信息中,主要關(guān)注地是磁盤的利用率以及IO信息,其中磁盤利用率使用psutil.disk_usage獲取。磁盤IO信息包括:read_count(讀IO數(shù))、write_count(寫IO數(shù))、read_bytes(IO讀字節(jié)數(shù))、write_bytes(IO寫字節(jié)數(shù))、read_time(磁盤讀時間)、write_time(磁盤寫時間)等。這些IO信息可以使用psutil.disk_io_counters()獲取,如下圖實例:
(4) 網(wǎng)絡信息
? 系統(tǒng)的網(wǎng)絡信息與磁盤IO類似,包括:bytes_sent(發(fā)送字節(jié)數(shù))、bytes_resv(接收字節(jié)數(shù))、packets_sent(發(fā)送數(shù)據(jù)包數(shù))、packets_recv(接收數(shù)據(jù)包數(shù))等。使用psutil_net_io_counters()方法獲取,操作如下:
?(5)其他系統(tǒng)信息
psutil模塊支持獲取用戶登錄、開機時間等信息,如下圖:
1.1.2 系統(tǒng)進程管理方法
? 獲得當前的系統(tǒng)信息地進程信息,可以讓運維人員得知應用程序的運行狀態(tài),包括進程的啟動時間、查看或者設置CPU親和度、內(nèi)存使用率、IO信息、socket連接、線程數(shù)等,這些信息可以呈現(xiàn)出指定進程是否存活、資源利用情況,為開發(fā)人員的代碼優(yōu)化、問題定位提供很好的數(shù)據(jù)參考。
(1)進程信息
? psutil.pids()獲取所有進程的PID,使用psutil.Process()方法獲取的那個進程的名稱、路徑、狀態(tài)、系統(tǒng)資源利用率等信息,如下圖:
?當輸入p.exe()出現(xiàn)錯誤
?
(2)popen類的使用
? psutil提供的popen類的作用是獲取用戶啟動的應用程序進程信息,以便跟蹤程序進程的運行狀態(tài)。如下圖:
1.2 實用的IP地址處理模塊IPy
IP地址規(guī)劃是網(wǎng)絡設計中非常重要的環(huán)節(jié),規(guī)劃的好壞會直接影響路由協(xié)議算法的效率,其中擺闊網(wǎng)絡性能、可擴展性等,在這過程中,是避免不了要計算大量的IP地址,例如網(wǎng)段、網(wǎng)絡掩碼、廣播地址、子網(wǎng)數(shù)、IP類型等。Python提供了強大的第三方模塊IPy,可以很好的輔助我們高效完成IP的規(guī)劃工作。
(1)IPy模塊安裝
(2)IP地址、網(wǎng)段的基本處理
IPy模塊包含IP類,使用他可以方便處理絕大部分格式為IPv6以及IPv4的網(wǎng)絡和地址。
可以通過cersion()來區(qū)分,首先要導入IPy庫,from IPy import IP ,之后進行操作,如下圖:
通過指定的網(wǎng)段輸出該網(wǎng)段的IP個數(shù)以及所有IP地址清單,代碼如下:
下面介紹IP類幾個常見的方法,包括反向解析名稱,IP類型,IP轉(zhuǎn)換等。iptype()代表ip類型,strHex()轉(zhuǎn)換成十六進制,strBin()轉(zhuǎn)換成二進制格式,IP(0x8080808)十六進制轉(zhuǎn)換成IP格式。
IP方法支持網(wǎng)絡地址的轉(zhuǎn)換,例如根據(jù)IP與掩碼生產(chǎn)網(wǎng)段格式,如下:
也可以通過strNormal方法指定不同wantprefixlen參數(shù)值以定制不同輸出類型的網(wǎng)段,輸出另外i行字符串,如下:
wantprefixlen = 0,無返回,如192.168.1.0
wantprefixlen = 1,prefix格式,192.168.1.0/24
wantprefixlen = 2,decima net mask格式,192.168.1.0/255.255.255.0
wantprefixlen = 3,lastIP格式,192.168.1.0-192.168.1.255
(3) 多網(wǎng)絡計算方法詳解
比較兩個網(wǎng)段是否存在包含、重疊等關(guān)系,同網(wǎng)絡但不同prefixlen會認為是不同的網(wǎng)段,例如192.168.0.0/16不等于192.168.0.0/24,另外即使具有相同的prefixlen但會處于不同的網(wǎng)絡地址,同樣視為不相等,例如10.0.0.0/16不等于192.0.0.0/16.IPy支持類似于數(shù)值型數(shù)據(jù)的比較,以幫助IP對象進行比較,如:
判斷IP地址和網(wǎng)段是否包含于另一個網(wǎng)段中:
判斷兩個網(wǎng)段是否存在重疊,采用IPy提供的overlaps方法,如下圖:(返回1有重疊,0沒有重疊)
實例 根據(jù)輸入的IP地址或者子網(wǎng)返回網(wǎng)絡、掩碼、廣播、反向解析、子網(wǎng)數(shù)、IP類型等信息。
運行結(jié)果:
?
?1.3 DNS處理模塊dnspython
? dnspython是Python實現(xiàn)的一個DNS工具包,他支持幾乎所有的記錄類型,可以用于查詢、傳輸并動態(tài)更i新ZONE信息,同時支持TSIG(事務簽名)驗證消息和EDNS0(擴展DNS)。在系統(tǒng)管理方面,我們可以利用其查詢功能來實現(xiàn)DNS服務監(jiān)控以及解析結(jié)果的校驗,可以代替nslookup及dig等工具,輕松做到與現(xiàn)有平臺的整合,下面進行詳細介紹。
?安裝:
(1)模塊域名解析方案詳解
dnspython模塊提供了大量的DNS處理方法,最常用的方法是域名查詢。dnspython提供了DNS的解析器類----resolver,使用他的query方法來實現(xiàn)域名的查詢功能。query方法如下:
其中,qname參數(shù)為查詢的域名。rdtype參數(shù)來制定RR資源的類型,常用的有以下幾種:
A記錄:將主機名轉(zhuǎn)換成IP地址
MX記錄:郵件交換記錄,定義郵件服務器的域名
CNAME:指的是別名記錄,實現(xiàn)域名間的映射
NS記錄:標記區(qū)域的域名服務器以及授權(quán)子域
PTR記錄:反向解析,與A記錄相反,將IP轉(zhuǎn)換成主機名
SOA記錄:SOA標記,一個其實授權(quán)區(qū)的定義
rdclass參數(shù)由于指定網(wǎng)絡類型(IN,CH,HS)其中IN是默認,使用廣泛。tcp參數(shù)由于指定查詢是否啟用TCP協(xié)議,默認False(不啟用)。source與source_port參數(shù)指定查詢源地址與端口,默認值為查詢設備IP地址和0。raise_on_answer參數(shù)用于指定當查詢無應答是是否觸發(fā)異常,默認為True。
(2)常見解析類型示例說明
常見的DNS解析類型包括A,MX,NS,CNAME等。利用dnspython的dns.resolver.query方法可以簡單的實現(xiàn)簡單的DNS類型的查詢,為后面要實現(xiàn)的功能提供數(shù)據(jù)來源,比如對各使用DNS輪循業(yè)務的域名進行可用性監(jiān)控,需要得到當前的解析結(jié)果。下面一一進行介紹。
A記錄:
運行結(jié)果:www.google.com
?MX記錄:
運行結(jié)果:163.com
NS記錄:
運行結(jié)果:baidu.com
CNAME記錄:
運行結(jié)果:www.baidu.com
?(3)實踐:DNS域名輪循業(yè)務監(jiān)控
大部分的DNS解析都是一個域名對應一個IP地址,但是通過DNS輪循技術(shù)可以做到一個域名對應多個IP,從而實現(xiàn)最簡單且高效的負載均衡,不過此方案最大的弊端是目標主機不可用時無法被自動解除,因此做好業(yè)務主機的服務可用監(jiān)控至關(guān)重要。本實例通過分析當前域名的解析IP,再結(jié)合服務端口探測來實現(xiàn)自動監(jiān)控,在域名解析中添加,刪除IP時,無需對監(jiān)控腳本進行更改。架構(gòu)圖:
步驟
1.實現(xiàn)域名的解析,獲取域名所有的A記錄解析IP列表;
2.對IP列表進行HTTP級別的探測
代碼解析
第一步通過dns.resolver.query()方法獲取業(yè)務域名A記錄,查詢出所有的IP地址列表,在使用httplib模塊的request()方法以GET方式請求監(jiān)控頁面,監(jiān)控業(yè)務所有服務的IP是否正常。
?
轉(zhuǎn)載于:https://www.cnblogs.com/KAJIA1/p/11290087.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Python自动化运维技术与最佳实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day_04-数组,元组,列表
- 下一篇: Shell入门02