DNS域名轮询业务监控
一、项目介绍
大部分的DNS解析都是一个域名对应一个IP地址,但是通过DNS轮询技术可以做到一个域名对应多个IP,从而实现最简单且高效的负载均衡,不过此方法最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的服务可用监控至关重要。此项目通过分析当前域名的解析IP,再结合服务端口探测来实现自动监控,在域名解析中添加,删除IP时,无须对监控脚本进行更改。
二、思路
- 实现域名的解析,获取域名所有的A记录解析IP列表
- 对IP列表进行HTTP级别的探测
三、编写程序
通过dns.resolver,query()方法获取业务域名A记录信息,查询出所有IP地址列表,再使用httplib模块的request方法以get方式请求监控页面,监控业务所有服务的IP是否服务正常。
#!/usr/bin env python
import dns.resolver
import http.client
ip_list=[] #定义域名IP列表变量
app_domain="baidu.com" #定义业务域名
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 None
for i in A.response.answer:
for j in i.items:
ip_list.append(j.address) #追加到iplist
return True
def checkip(ip):
check_url=ip + ":80"
get_content=""
code=None
conn=http.client.HTTPConnection(check_url,timeout=5) #创建http连接对象,定义http连接超时时间(5秒)
try:
conn.request("GET","/",headers={"Host": app_domain}) #发起URL请求,添加http连接对象
r=conn.getresponse()
get_content=r.read(15) #获取URL页面前15的字符,以便做可用性校验
code=r.code #获取状态码
finally:
if get_content=="<!DOCTYPE HTML>": #获取URL页面的内容一般是事先定义好的,比如"HTTP2000"等
print(ip + " [OK]")
elif code in [200,301,302]: #正常状态码
print(ip + " [OK]")
else:
print(ip + " [Error]") #此处可放告警程序,可以是邮件、短信通知
if __name__ == '__main__':
if get_iplist(app_domain) and len(ip_list) > 0: #条件:域名解析正确至少返回一个IP
for ip in ip_list:
checkip(ip)
else:
print('dns resolver error.')
# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/案例1.py
123.125.115.110 [OK]
220.181.57.216 [OK]
分类
#!/usr/bin env python import dns.resolver import http.client ip_list=[] #定义域名IP列表变量 app_domain="baidu.com" #定义业务域名 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 None for i in A.response.answer: for j in i.items: ip_list.append(j.address) #追加到iplist return True def checkip(ip): check_url=ip + ":80" get_content="" code=None conn=http.client.HTTPConnection(check_url,timeout=5) #创建http连接对象,定义http连接超时时间(5秒) try: conn.request("GET","/",headers={"Host": app_domain}) #发起URL请求,添加http连接对象 r=conn.getresponse() get_content=r.read(15) #获取URL页面前15的字符,以便做可用性校验 code=r.code #获取状态码 finally: if get_content=="<!DOCTYPE HTML>": #获取URL页面的内容一般是事先定义好的,比如"HTTP2000"等 print(ip + " [OK]") elif code in [200,301,302]: #正常状态码 print(ip + " [OK]") else: print(ip + " [Error]") #此处可放告警程序,可以是邮件、短信通知 if __name__ == '__main__': if get_iplist(app_domain) and len(ip_list) > 0: #条件:域名解析正确至少返回一个IP for ip in ip_list: checkip(ip) else: print('dns resolver error.') # run /usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/IPy实用的IP地址处理模块/案例1.py 123.125.115.110 [OK] 220.181.57.216 [OK]