Python自動化運維技術與最佳實現


 

第一章 系統基礎信息模塊詳解

  系統基礎信息采集模塊最為監控模塊的重要組成部分,能夠幫助運維人員了解當前系統的健康程度,同時也是衡量業務的服務質量的依據,比如系統資源吃緊,會直接影響業務的質量以及用戶的體驗,另外獲取設備的流量信息,也可以讓運維人員更好地評估帶寬、設備資源是否應該擴容。

  本章通過具體的實例來幫助讀者學習、理解並掌握。在本章接下來的內容中,可以通過運用Python第三方系統基礎模塊,獲取服務關鍵運營指標數據,其中包括Linux基本性能、塊設備、網卡接口、系統信息、網絡地址庫等信息。當采集到在這些信息后,可以全方位的了解系統服務的狀態,結合告警機制,可以在第一時間響應,將異常剛剛出現時得以及時的處理。

以下實例都是在一個連續的Python=交互環境中進行。

1.1 系統性能信息模塊psutil

  psutil是一個跨平台庫,可以輕松地實現獲取系統運行的進程和系統利用率其中包括CPU、內存、硬盤、網絡信息等。主要用於系統監控,分析和限制系統資源以及進程的管理。

  支持的命令包括:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskst、pmap等。

  通常獲取系統信息采用編寫shell來實現,如獲取當前物理機的內存總大小以及使用大小,shell命令

total: free -m | grep Mem | awk ‘{print $2}’

used:  free -m | grep Mem | awk ‘{print $3}’

  使用psutil庫實現就更加簡單明了。psutil大小單位采用的是字節,實例如下圖:

源碼安裝:

1.1.1 獲取系統性能信息

  psutil已經封裝了獲取系統性能信息的方法,可以根據用戶的應用場景,來調用相應的方法媽祖用戶需求。

(1)CPU信息

 linux中的cpu利用率包括以下幾部分:

User Time 執行用戶進程的時間百分比

System Time 執行內核進程和中斷的時間百分比

Wait IO 由於IO等待而使CPU處於idle(空閑)狀態的時間百分比

Idle Cpu處於空心狀態的時間百分比

  使用psutil.cpu_times()方法可以非常簡單的得到信息,同時獲取CPU的硬件信息,比如CPU的物理個數與邏輯個數,如下圖:

使用psutil.cpu_times()獲取cpu完整信息,需要顯示所有邏輯CPU信息,指定方法變量percpu=True,例如psutil.cpu_times(percpu=True)。

獲取單項數據信息,用戶user的CPU時間比

(2)內存信息

  Linux操作系統中的內存利用率包括total(內存總數),used(已使用的內存數),free(空閑內存數),buffers(緩沖使用數),cache(緩存使用數),swap(交換分區使用數)等等。分別使用  psutil.virtual_memory()和psutil.swap_memory()方法獲取這些信息。詳細操作如下圖:

(3) 磁盤信息

  在系統地所有磁盤信息中,主要關注地是磁盤的利用率以及IO信息,其中磁盤利用率使用psutil.disk_usage獲取。磁盤IO信息包括:read_count(讀IO數)、write_count(寫IO數)、read_bytes(IO讀字節數)、write_bytes(IO寫字節數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)等。這些IO信息可以使用psutil.disk_io_counters()獲取,如下圖實例:

(4) 網絡信息

  系統的網絡信息與磁盤IO類似,包括:bytes_sent(發送字節數)、bytes_resv(接收字節數)、packets_sent(發送數據包數)、packets_recv(接收數據包數)等。使用psutil_net_io_counters()方法獲取,操作如下:

 (5)其他系統信息

psutil模塊支持獲取用戶登錄、開機時間等信息,如下圖:

1.1.2 系統進程管理方法

  獲得當前的系統信息地進程信息,可以讓運維人員得知應用程序的運行狀態,包括進程的啟動時間、查看或者設置CPU親和度、內存使用率、IO信息、socket連接、線程數等,這些信息可以呈現出指定進程是否存活、資源利用情況,為開發人員的代碼優化、問題定位提供很好的數據參考。

(1)進程信息

  psutil.pids()獲取所有進程的PID,使用psutil.Process()方法獲取的那個進程的名稱、路徑、狀態、系統資源利用率等信息,如下圖:

 當輸入p.exe()出現錯誤

 

(2)popen類的使用

  psutil提供的popen類的作用是獲取用戶啟動的應用程序進程信息,以便跟蹤程序進程的運行狀態。如下圖:

1.2 實用的IP地址處理模塊IPy

  IP地址規划是網絡設計中非常重要的環節,規划的好壞會直接影響路由協議算法的效率,其中擺闊網絡性能、可擴展性等,在這過程中,是避免不了要計算大量的IP地址,例如網段、網絡掩碼、廣播地址、子網數、IP類型等。Python提供了強大的第三方模塊IPy,可以很好的輔助我們高效完成IP的規划工作。

(1)IPy模塊安裝

(2)IP地址、網段的基本處理

  IPy模塊包含IP類,使用他可以方便處理絕大部分格式為IPv6以及IPv4的網絡和地址。

  可以通過cersion()來區分,首先要導入IPy庫,from IPy import IP ,之后進行操作,如下圖:

通過指定的網段輸出該網段的IP個數以及所有IP地址清單,代碼如下:

下面介紹IP類幾個常見的方法,包括反向解析名稱,IP類型,IP轉換等。iptype()代表ip類型,strHex()轉換成十六進制,strBin()轉換成二進制格式,IP(0x8080808)十六進制轉換成IP格式。

IP方法支持網絡地址的轉換,例如根據IP與掩碼生產網段格式,如下:

也可以通過strNormal方法指定不同wantprefixlen參數值以定制不同輸出類型的網段,輸出另外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) 多網絡計算方法詳解

  比較兩個網段是否存在包含、重疊等關系,同網絡但不同prefixlen會認為是不同的網段,例如192.168.0.0/16不等於192.168.0.0/24,另外即使具有相同的prefixlen但會處於不同的網絡地址,同樣視為不相等,例如10.0.0.0/16不等於192.0.0.0/16.IPy支持類似於數值型數據的比較,以幫助IP對象進行比較,如:

判斷IP地址和網段是否包含於另一個網段中:

判斷兩個網段是否存在重疊,采用IPy提供的overlaps方法,如下圖:(返回1有重疊,0沒有重疊)

實例 根據輸入的IP地址或者子網返回網絡、掩碼、廣播、反向解析、子網數、IP類型等信息。

運行結果:

 

 1.3 DNS處理模塊dnspython

   dnspython是Python實現的一個DNS工具包,他支持幾乎所有的記錄類型,可以用於查詢、傳輸並動態更i新ZONE信息,同時支持TSIG(事務簽名)驗證消息和EDNS0(擴展DNS)。在系統管理方面,我們可以利用其查詢功能來實現DNS服務監控以及解析結果的校驗,可以代替nslookup及dig等工具,輕松做到與現有平台的整合,下面進行詳細介紹。

 安裝:

(1)模塊域名解析方案詳解

  dnspython模塊提供了大量的DNS處理方法,最常用的方法是域名查詢。dnspython提供了DNS的解析器類----resolver,使用他的query方法來實現域名的查詢功能。query方法如下:

其中,qname參數為查詢的域名。rdtype參數來制定RR資源的類型,常用的有以下幾種:

A記錄:將主機名轉換成IP地址

MX記錄:郵件交換記錄,定義郵件服務器的域名

CNAME:指的是別名記錄,實現域名間的映射

NS記錄:標記區域的域名服務器以及授權子域

PTR記錄:反向解析,與A記錄相反,將IP轉換成主機名

SOA記錄:SOA標記,一個其實授權區的定義

  rdclass參數由於指定網絡類型(IN,CH,HS)其中IN是默認,使用廣泛。tcp參數由於指定查詢是否啟用TCP協議,默認False(不啟用)。source與source_port參數指定查詢源地址與端口,默認值為查詢設備IP地址和0。raise_on_answer參數用於指定當查詢無應答是是否觸發異常,默認為True。

(2)常見解析類型示例說明

  常見的DNS解析類型包括A,MX,NS,CNAME等。利用dnspython的dns.resolver.query方法可以簡單的實現簡單的DNS類型的查詢,為后面要實現的功能提供數據來源,比如對各使用DNS輪循業務的域名進行可用性監控,需要得到當前的解析結果。下面一一進行介紹。

A記錄:

運行結果:www.google.com

 MX記錄:

運行結果:163.com

NS記錄:

運行結果:baidu.com

CNAME記錄:

運行結果:www.baidu.com

 (3)實踐:DNS域名輪循業務監控

  大部分的DNS解析都是一個域名對應一個IP地址,但是通過DNS輪循技術可以做到一個域名對應多個IP,從而實現最簡單且高效的負載均衡,不過此方案最大的弊端是目標主機不可用時無法被自動解除,因此做好業務主機的服務可用監控至關重要。本實例通過分析當前域名的解析IP,再結合服務端口探測來實現自動監控,在域名解析中添加,刪除IP時,無需對監控腳本進行更改。架構圖:

步驟

1.實現域名的解析,獲取域名所有的A記錄解析IP列表;

2.對IP列表進行HTTP級別的探測

代碼解析

第一步通過dns.resolver.query()方法獲取業務域名A記錄,查詢出所有的IP地址列表,在使用httplib模塊的request()方法以GET方式請求監控頁面,監控業務所有服務的IP是否正常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM