大部分的DNS解析是一个域名对应一个IP地址,但是通过DNS轮循技术可将一个域名对应多个IP地址,这样可以实现简单且高效的负载平衡,但是轮循技术有一个缺点就是当目标主机不可用时,不能自动的删除,所以引出了要对业务主机的服务的可用性进行监控。
本例通过分析当前域名的解析IP,再结合服务端口探测来实现自动监控,在域名解析中添加、删除IP时,无须对监控脚步更改。
! Python 2.x中的"httplib"模块在Python 3.x中变为"http.client"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/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."
)