天天看點

《Python自動化運維:技術與最佳實踐》一1.3 DNS處理子產品dnspython

本節書摘來自華章出版社《python自動化運維:技術與最佳實踐》一書中的第1章,第1.3節,作者 (美)neil bergman ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

首先介紹dnspython子產品的安裝,這裡采用源碼的安裝方式,最新版本為1.9.4,如下:

dnspython子產品提供了大量的dns處理方法,最常用的方法是域名查詢。dnspython提供了一個dns解析器類—resolver,使用它的query方法來實作域名的查詢功能。query方法的定義如下:

query(self, qname, rdtype=1, rdclass=1, tcp=false, source=none, raise_on_no_answer=true, source_port=0)

其中,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_no_answer參數用于指定當查詢無應答時是否觸發異常,預設為true。

常見的dns解析類型包括a、mx、ns、cname等。利用dnspython的dns.resolver. query方法可以簡單實作這些dns類型的查詢,為後面要實作的功能提供資料來源,比如對一個使用dns輪循業務的域名進行可用性監控,需要得到目前的解析結果。下面一一進行介紹。

(1)a記錄

實作a記錄查詢方法源碼。

運作代碼檢視結果,這裡以www.google.com域名為例:

(2)mx記錄

實作mx記錄查詢方法源碼。

運作代碼檢視結果,這裡以163.com域名為例:

(3)ns記錄

實作ns記錄查詢方法源碼。

大部分的dns解析都是一個域名對應一個ip位址,但是通過dns輪循技術可以做到一個域名對應多個ip,進而實作最簡單且高效的負載平衡,不過此方案最大的弊端是目标主機不可用時無法被自動剔除,是以做好業務主機的服務可用監控至關重要。本示例通過分析目前域名的解析ip,再結合服務端口探測來實作自動監控,在域名解析中添加、删除ip時,無須對監控腳本進行更改。實作架構圖如圖1-1所示。

《Python自動化運維:技術與最佳實踐》一1.3 DNS處理子產品dnspython

步驟

1)實作域名的解析,擷取域名所有的a記錄解析ip清單;

2)對ip清單進行http級别的探測。

代碼解析

本示例第一步通過dns.resolver.query()方法擷取業務域名a記錄資訊,查詢出所有ip位址清單,再使用httplib子產品的request()方法以get方式請求監控頁面,監控業務所有服務的ip是否服務正常。

我們可以将此腳本放到crontab中定時運作,再結合告警程式,這樣一個基于域名輪循的業務監控已完成。運作程式,顯示結果如下:

從結果可以看出,域名www.google.com.hk解析出3個ip位址,并且服務都是正常的。