大部分的DNS解析是一個域名對應一個IP地址,但是通過DNS輪循技術可將一個域名對應多個IP地址,這樣可以實現簡單且高效的負載平衡,但是輪循技術有一個缺點就是當目標主機不可用時,不能自動的刪除,所以引出了要對業務主機的服務的可用性進行監控。
本例通過分析當前域名的解析IP,再結合服務端口探測來實現自動監控,在域名解析中添加、刪除IP時,無須對監控腳步更改。
! Python 2.x中的"httplib"模塊在Python 3.x中變爲"http.client"
#!/usr/bin/python3 # import dns.resolver import os import http.client iplist=[] #定義域名IP列表變量 appdomain="www.google.cn" #定義業務域名 def get_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: iplist.append(j.address) #追加到iplist return True def checkip(ip): checkurl = ip+":80" getcontent = "" http.client.socket.setdefaulttimeout(5) #定義http連接超時時間(5秒) conn = http.client.HTTPConnection(checkurl) #創建http連接對象 try: conn.request("GET", "/", headers = {"Host": appdomain}) #發起url請求,添加host主機頭 r = conn.getresponse() getcontent = r.read(15) #獲取url頁面前15個字符,以便做可用性校驗 finally: if getcontent == "<!doctype html>": #監控URL頁的內容一般是事先定義好的,比如"HTTP200"等 print (ip+" [OK]") else: print (ip+" [Error]") #此處可放告警程序,可以是郵件、短信通知 if __name__ == "__main__": if get_iplist(appdomain) and len(iplist)>0: #條件:域名解析正確且至少返回一個IP for ip in iplist: checkip(ip) else: print ("dns resolver error.")