自动预警和替换DNS解析服务器地址

最近一段时间,国内的一些DNS解析服务器会时不时的请求超时,结果就是线上业务会出问题导致某些服务器的 API 地址不能解析。总是在出问题后再上线改服务器,虽然用 saltsatck 下发一下resolv.conf 文件很方便,但是当我们意识到 DNS 解析出问题的时候,可能故障已经发生很久了-_-!。如是,写了个脚本实现自动检测 DNS 服务器是否解析正常,如果不正常自动更新系统的 DNS 解析服务器地址。
脚本的内容如下,写的不够精简:

#coding=utf-8
#!/usr/bin/python
import os
import time

################ 测试DNS是否解析正常 #########################
def check():
    TargetUrl = ('api.xxxxxx.com', 'api.xxxxxxxxx.com')
    start = time.time()
    for url in TargetUrl:
        command = 'nslookup ' + url + '> /dev/null'
        os.system(command)
    end = time.time()
    return end-start

################# 如果超过阀值就更改/etc/resolv.conf文件 #####
def failnum():
    count = 0
    for i in (1,2):
        if(check() >= 1):
            count = count + 1
    return count

def chgfile(dns1, dns2, dns3):
    filename = '/etc/resolv.conf'
    fp = open(filename, "w")
    dnslist = ['nameserver ' + dns1 + "\n", 'nameserver ' + dns2 + "\n", 'nameserver ' + dns3 + "\n"]
    fp.writelines(dnslist)
    fp.close()

def main():
    DnsPool = ['202.96.209.133', '202.96.199.133', '202.96.209.5', '101.226.4.6']
    while True:
        if failnum() == 2:
            chgfile(DnsPool[0], DnsPool[1], DnsPool[2])
            DnsPool.append(DnsPool[0])
            DnsPool.pop(0)
        time.sleep(5)

####################嗯,这个就不解释了#####################
if __name__ == "__main__":
    main()

给脚本加上 x 权限,再用nohup命令放到后台执行就好了,什么不知道nohup命令!百度或谷歌或man,哈哈。
该脚本的思路很简单的,每隔一段时间来检测一下你所关心的域名是否正常,如果不正常的值超过了阀值,那么就更新/etc/resolv.conf文件。该脚本 check( ) 函数的元祖TargetUrl 存放的是需要检测的域名,可增减,但要大于1个是吧。main( )函数中的列表是待替换的 DNS解析服务器地址,是循环使用的,因为这些服务器不会一直出问题的。
改脚本我用了两个域名做测试,失败阀值是 1 秒(因为当第一个DNS域名解析服务器解析正常时耗时远远小于 1 s,而当第一个DNS域名解析服务器不正常而第二个正常时,解析时间大概在 3.7 秒左右),连续失败 2 次就更新DNS解析服务器地址列表。
转载请注明出处http://www.xiaomastack.com/2014/06/27/pythondns/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

41 − 31 =