python3實現DNS網域名稱輪循業務監控

2021-08-25 11:21:24 字數 1898 閱讀 7193

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

1. 步驟

1)實現網域名稱的解析,獲取網域名稱所有的a記錄解析ip列表;

2)對ip列表進行http級別的探測。

2. **解析

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

# python 2.x中的"httplib"模組在python 3.x中變成了"http.client"

iplist= #定義域名ip列表變數

#定義業務網域名稱

defget_iplist

(domain=""):

#網域名稱解析函式,解析成功ip將被追加到iplist

try:

a = dns.resolver.query(domain, 'a') #解析a記錄型別

except exception as e:

print ("dns resolver error:"+str(e))

return

for i in a.response.answer:

for j in i.items:

if j.rdtype == 1:

return

true

defcheckip

(ip):

checkurl=ip+":80"

getcontent=""

http.client.socket.setdefaulttimeout(5) #定義http連線超時時間(5秒)

conn=http.client.httpconnection(checkurl) #建立http連線物件

try:

r=conn.getresponse()

getcontent =r.read(15) #獲取url頁面前15個字元,以便做可用性校驗

# print(getcontent) # 輸出的是b''。需要用bytes轉換下

finally:

if getcontent==bytes("", 'utf-8'): #監控url頁的內容一般是事先定義好的,比如「http200」等

print (ip+" [ok]")

else:

print (ip+" [error]" ) #此處可放告警程式,可以是郵件、簡訊通知

if __name__=="__main__":

for ip in iplist:

checkip(ip)

else:

print ("dns resolver error.")

我們可以將此指令碼放到crontab中定時執行,再結合告警程式,這樣乙個基於網域名稱輪循的業務監控已完成。執行程式,顯示結果如下:

74.125.31.94 [ok]

74.125.128.199 [ok]

173.194.72.94 [ok]

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

DNS網域名稱輪循業務監控

我們一般的dns解析是乙個網域名稱對應乙個ip位址,但是若我們用dns輪循技術即可將乙個網域名稱對應多個ip位址,這樣可以實現簡單且高效的負載平衡,但是輪循技術有乙個缺點就是當目標主機不可用時,不能自動的刪除,所以引出了要對業務主機的服務的可用性進行監控。具體流程是利用dnspython模組的res...

Python學習筆記 DNS網域名稱輪循業務監控

大部分的dns解析是乙個網域名稱對應乙個ip位址,但是通過dns輪循技術可將乙個網域名稱對應多個ip位址,這樣可以實現簡單且高效的負載平衡,但是輪循技術有乙個缺點就是當目標主機不可用時,不能自動的刪除,所以引出了要對業務主機的服務的可用性進行監控。本例通過分析當前網域名稱的解析ip,再結合服務埠探測...

python3 提取主網域名稱

一瓶水,兩包豆奶,乙個破站 一天。又是徘徊在 之間的一天。閒的很,這是我未完成的某個工具其中乙個函式。import re defgetwant url rewant re.compile a za z d rewant.findall url 這是阿里雲網域名稱字尾大全 我排除了一些太不常見的和中文...