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' 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中定时运行,再结合告警程序,这样一个基于域名轮循的业务监控完成。
- DNS处理模块dnspython之域名轮循业务监控
- python自动化运维学习笔记2- 实用的IP地址处理模块IPy
- Python学习笔记-DNS域名轮循业务监控
- Python学习笔记-DNS域名轮循业务监控
- python自动化学习-实用的iP地址处理模块IPy
- Python自动化运维之IP地址处理模块详解
- 【Python】DNS域名轮循业务监控
- Python学习笔记-IP地址处理模块Ipy
- Python学习笔记-IP地址处理模块Ipy
- DNS处理模块dnspython之详解模块域名解析方法
- python自动化运维 第2章 业务服务监控详解 2.1.1
- Python之实用的IP地址处理模块IPy
- DNS域名轮循业务监控
- Python之实用的IP地址处理模块IPy
- python笔记系列:IP地址处理模块IPy
- 【python】IP地址处理模块IPy
- Python自动化运维笔记(二):Python中的IP地址处理模块IPy的使用
- Python之DNS域名轮询业务监控
- 2、python自动化运维——业务监控详解