您的位置:首页 > 编程语言 > Python开发

Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)

2019-07-09 20:41 951 查看

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'
3ff7
% 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中定时运行,再结合告警程序,这样一个基于域名轮循的业务监控完成。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: