Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)
Posted 抛物线.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)相关的知识,希望对你有一定的参考价值。
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面。在这个过程当中,免不了要计算大量的IP地址,包含网段、网络掩码、广播地址、子网数、Ip类型等。
IPy模块可以很好的辅助我们高校完成Ip的规划工作。
1.1 IP地址、网段基本处理
IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6以及IPv4的网络和地址。
比如通过version方法就可以区分出IPv4和IPv6
eg:
>>> from IPy import IP
>>> IP('192.168.217.135').version()
4
>>> IP('::1').version()
6
>>>
通过指定的网段输出该网段的IP个数以及所有IP地址清单,
[root@devops python]# vim ip.py
1 #!/usr/bin/env python
2 from IPy import IP
3 ip = IP('192.168.217.135')
4 print (ip.len())
5 for x in ip:
6 print(x)
执行结果如下:
[root@devops python]# python ip.py
1
192.168.217.135
下面介绍常用的Ip类的几个常见方法,包括反向解析名称、IP类型、IP转换等
>>> ip = IP('192.168.217.135')
>>> ip.reverseNames() #反向解析地址格式
['135.217.168.192.in-addr.arpa.']
>>> ip.iptype() # 为私网类型
'PRIVATE'
>>>
>>> IP('8.8.8.8').int() #转换为整形格式
134744072
>>> IP('8.8.8.8').strHex() #转换为十六进制格式
'0x8080808'
>>> IP('8.8.8.8').strBin() #转换为二进制格式
'00001000000010000000100000001000'
>>>
示例:根据输入的Ip或者子网返回网络、掩码、广播、反向解析、子网数、Ip类型等信息
[root@devops python]# vim pyIPy.py
1 #!/usr/bin/env python
2 from IPy import IP
3
4 #def input(param):
5 # pass
6 ip_s = input('Please input an IP or net-range:')
7 #if ip_s is None:
8 # print("ip_s is None!!!")
9 ips = IP(ip_s)
10 if len(ips) > 1:
11 print('net: %s' % ips.net())
12 print('netmask: %s' % ips.netmask())
13 print('broadcast: %s' % ips.broadcast())
14 print('reverse address: %s' % ips.reverseNames()[0])
15 print('subnet: %s' % len(ips))
16 else:
17 print('reverse address: %s' % ips.reverseName()[0])
18
19 print('hexadecimal: %s' % ips.strHex())
20 print('binary ip: %s' % ips.strBin())
21 print('iptype: %s' % ips.iptype())
22 print('ip_version: %s' % ips.version())
运行输出结果:
[root@devops python]# python pyIPy.py
Please input an IP or net-range:192.168.100.10
reverse address: 1
hexadecimal: 0xc0a8640a
binary ip: 11000000101010000110010000001010
iptype: PRIVATE
ip_version: 4
[root@devops python]# python pyIPy.py
Please input an IP or net-range:192.168.100.0/24
net: 192.168.100.0
netmask: 255.255.255.0
broadcast: 192.168.100.255
reverse address: 100.168.192.in-addr.arpa.
subnet: 256
hexadecimal: 0xc0a86400
binary ip: 11000000101010000110010000000000
iptype: PRIVATE
ip_version: 4
[root@devops python]#
2 。DNS处理模块dnspython
dnspython (http://www.dnspyhon.org)是Python实现的一个 DNS工具包,它支持几乎所有的记录类型,
可以用于查询、传输并动态更新ZONE信息,
同时支持TSIG (事务签名)验证消息和EDNSO (扩展DNS)。
在系统管理方面,我们可以利用其查询功能来实现DNS服务监控以及解析结果的校验,可以代替nslookup及dig等工具,轻松做到与现有平台的整合.
首先介绍dnspython模块的安装,这里采用源码的安装方式如下:
# http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
# tar -zxvf dnspython-1.9.4.tar.gz
# cd dnspython-1.9.4
# python setup.py install
dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询
dnspython供了一个DNS解析器类一resolver, 使用它的query方法来实现域名的查询功能。
query()方法的定义如下:
query(self ,qname,rdtype=1,rdclass=1,tcp=Flase,source=None,raise_on_no_answer=True,source_port=0)
其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:
A记录,将主机名转换为Ip地址
MX记录,邮件交换记录,定义邮件服务器的域名
CNAME记录 指别名记录,实现域名间的映射
NS记录,标记区域的域名服务器以及授权子域
PTR记录 反向解析,与A记录相反,将Ip转换为主机名
SOA记录 SOA标记,一个起始授权区的定义
2.1 A记录:
[root@devops python]# vim dnsDemo.py
1 #!/usr/bin/env python
2 import dns.resolver
3 #def raw_input(param):
4 # pass
5 domain = input('Please input an domain:')
6 A = dns.resolver.query(domain,rdtype='A') #指定查询类型为A记录
7 for i in A.response.answer: #通过response.answer 方法获取查询回应信息
8 for j in i.items: #遍历回应信息
9 print (j)
运行结果:
[root@devops python]# python dnsDemo.py
Please input an domain:www.google.com
6.6.6.6
[root@devops python]#
2.2 MX记录:
[root@devops python]# vim simple1MX.py
1 #!/usr/bin/env python
2 import dns.resolver
3 domain = input('Please input an domain:') # example 163.com
4 MX = dns.resolver.query(domain,rdtype='MX') #指定查询类型为MX记录
5 for i in MX: #遍历回应信息
6 print ('MX preference = ',i.preference,'mail exchanger = ',i.exchange)
运行结果:
[root@devops python]# python simple1MX.py
Please input an domain:baidu.com
MX preference = 10 mail exchanger = mx.maillb.baidu.com.
MX preference = 20 mail exchanger = jpmx.baidu.com.
MX preference = 15 mail exchanger = mx.n.shifen.com.
MX preference = 20 mail exchanger = mx50.baidu.com.
MX preference = 20 mail exchanger = mx1.baidu.com.
[root@devops python]#
[root@devops python]# python simple1MX.py
Please input an domain:163.com
MX preference = 10 mail exchanger = 163mx02.mxmail.netease.com.
MX preference = 10 mail exchanger = 163mx03.mxmail.netease.com.
MX preference = 50 mail exchanger = 163mx00.mxmail.netease.com.
MX preference = 10 mail exchanger = 163mx01.mxmail.netease.com.
2.3 NS记录:
[root@devops python]# vim simple1NS.py
1 #!/usr/bin/env python
2 import dns.resolver
3 #LimitOneLeavelDomain example baidu.com
4 domain = input('Please input an domain:')
5 ns = dns.resolver.query(domain,rdtype='NS')
6 for i in ns.response.answer:
7 for j in i.items:
8 print (j.to_text())
~
运行结果:
注意:这里仅仅只能输入一级域名,如baidu.com
[root@devops python]# python simple1NS.py
Please input an domain:baidu.com
ns7.baidu.com.
ns4.baidu.com.
dns.baidu.com.
ns3.baidu.com.
ns2.baidu.com.
2.4 CNAME记录:
[root@devops python]# vim simple2CNAME.py
1 #!/usr/bin/env python
2 import dns.resolver
3 domain = input('Please input an domain:')
4 cname = dns.resolver.query(domain,rdtype='CNAME') #指定查询类型为CNAME记录
5 for i in cname.response.answer: #结果将回应cname后的目标域名
6 for j in i.items:
7 print (j.to_text())
综合:DNS域名轮循业务监控
大部分的DNS解析都是一个域名对应 一个 IP地址,但是通过DNS轮循技术可以做到一个域名对应多个 IP,
从而实现最简单且高效的负载平衡,不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的眼务可用监控至关重要。
本示例通过分析当前域名的解析IP,再结合服务端口探测来实现自动监控,在域名解析中添加、删除IP时,
无须对监控脚本进行更改。架构图如下所示:(使用PPT绘制,效果不太明显)
1.步骤
1 )实现城名的解析,获取域名所有的A记录解析IP列表;
2)对IP列表进行HTTP级别的探测。
2.代码解析
第一步通过 dns.resolver.query()方法获取业务城名^记录信息,查询出所有IP地址列表,再使用httplib模块的request()方法以GET方式请求监控页面,监控业务所有服务的IP是否服务正常。
[root@devops python]# vim simple5DnsDomain.py
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 import dns.resolver
4 import os
5 import httplib
6
7 iplist=[] #定义域名IP的列表变量
8 appdomain='www.google.com.hk' #定义业务域名
9
10 def get_iplist(domain=""): #域名解析函数,解析成功IP将被追加到iplist
11 try:
12 A = dns.resolver.query(domain,rdtype='A') #解析A记录类型
13 except Exception,e:
14 print "dns resolver error:"+str(e)
15 return
16 for i in A.response.answer:
17 for j in i.items:
18 iplist.append(j.address) #追加到iplist
19 return True
20 def checkip(ip):
21 checkurl=ip+":80"
22 getcontent=""
23 httplib.socket.setdefaulttimeout(5) #定义http连接超时时间为5秒
24 conn=httplib.HTTPConnection(checkurl) #创建http连接对象
25
26 try:
27 conn.request("GET","/",headers = "Host":appdomain) #发起URL请求,添加host主机头
28 r=conn.getresponse()
29 getcontent=r.read(15) #获取URL页面前15个字符,以便做可用性校验
30 finally:
31 if getcontent=="<!doctype html>": #监控URL页的内容一般是事先定义好的,比"HTTP200"等
32 print ip+" [OK]"
33 else:
34 print ip+" [Error]" #此处可放告警程序,可以是邮件、短信通知
35 if __name__=="__main__":
36 if get_iplist(appdomain) and len(iplist)>0: #条件:域名解析正确且至少返回一个IP
"simple5DnsDomain.py" 40L, 1326C
我们可以将此脚本放到crontab中定时运行,再结合告警程序,这样一个基于域名轮循的业务监控完成。
以上是关于Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)的主要内容,如果未能解决你的问题,请参考以下文章