www.75271.com解析有多个A记录,下面是实现故障切换的脚本:
通过检测网站的返回状态码来确定服务器的健康状况,如果不返回或返回的状态非200,则开始记录一次故障,连续三次故障后开始删除此域名的故障ip A记录,如果之后的检测发现服务器已经恢复,则重新添加此ip的A记录。
- #!/bin/bash
- #===============================================================================
- #Description: this script is to automactic update dns record when website is down.
- #Author : www.75271.com
- #文件说明:
- # /tmp/domain_list.txt 需要监控的域名列表,每行一个域名
- # /tmp/${domain}_online_ip.txt 记录在线的服务器ip,需要提前写入IP,每行一个IP
- # /tmp/${domain}_down_ip.txt 记录有故障的服务器ip
- # /tmp/curl.txt 记录curl获取的http状态码
- # /tmp/${domain}_${server_ip}_cur_time.txt 记录服务器出现故障的次数
- #===============================================================================
- #设置一些必要的变量
- keyname=rndc-key
- keysecret=gAnBYq6xSv7FKTZFmzAD0Q==
- #用来检测本机网络是否正常
- function network_detect(){
- ping -c1 8.8.8.8 >/dev/null 2>&1 && echo connect || exit 1
- }
- #用来删除DNS记录
- function del_record(){
- /usr/local/bind/bin/nsupdate <<EOF
- key $keyname $keysecret
- update delete $domain A $1
- send
- quit
- EOF
- }
- #用来增加DNS记录
- function add_record(){
- /usr/local/bind/bin/nsupdate <<EOF
- key $keyname $keysecret
- update add $domain 3600 A $1
- send
- quit
- EOF
- }
- #用来检测在线ip列表健康状态
- function online_detect(){
- if [ -s /tmp/${domain}_online_ip.txt ] ;then
- for server_ip in `cat /tmp/${domain}_online_ip.txt` ;
- do
- curl -I -l -H “Host:$domain” $server_ip -o “/tmp/curl.txt” >/dev/null 2>&1
- ###判断状态码是否为200
- if [ -s /tmp/curl.txt ] && grep ‘200 OK’ /tmp/curl.txt >/dev/null 2>&1;then
- echo “OK”
- ###清空故障次数
- rm -f /tmp/${domain}_${server_ip}_cur_time.txt
- ###状态码非200时
- else
- ###开始计算故障次数
- cur_time=0
- [ -s /tmp/${domain}_${server_ip}_cur_time.txt ] && cur_time=`cat /tmp/${domain}_${server_ip}_cur_time.txt `
- cur_time=`expr $cur_time + 1`
- ###当故障次数大于等于3时
- if [ $cur_time -gt 3 ];then
- ###删除故障ip记录
- del_record $server_ip
- ###从在线ip列表中删除故障ip
- sed -i “/$server_ip/d” /tmp/${domain}_online_ip.txt
- ###记录故障ip到文件
- echo $server_ip >> /tmp/${domain}_down_ip.txt
- ###删除记录此ip的故障文件
- rm -f /tmp/${domain}_${server_ip}_cur_time.txt
- else
- ###记录故障次数
- echo $cur_time > /tmp/${domain}_${server_ip}_cur_time.txt
- fi
- fi
- rm -f /tmp/curl.txt
- done
- fi
- }
- #用来检测故障ip列表健康状态
- function down_detect(){
- if [ -s /tmp/${domain}_down_ip.txt ];then
- for server_ip in `cat /tmp/${domain}_down_ip.txt` ;
- do
- curl -I -l -H “Host:$domain” $server_ip -o “/tmp/curl.txt” >/dev/null 2>&1
- if [ -s /tmp/curl.txt ] && grep ‘200 OK’ /tmp/curl.txt >/dev/null 2>&1;then
- ###添加A记录
- add_record $server_ip
- ###从${domain}_down_ip.txt删除故障ip
- sed -i “/$server_ip/d” /tmp/${domain}_down_ip.txt
- ###重新添加此ip到${domain}_online_ip.txt
- echo $server_ip >> /tmp/${domain}_online_ip.txt
- fi
- rm -f /tmp/curl.txt
- done
- fi
- }
- network_detect
- if [ -s /tmp/domain_list.txt ];then
- for domain in `cat /tmp/domain_list.txt` ;
- do
- online_detect
- down_detect
- done
- else
- echo “/tmp/domain_list.txt not found!”
- exit 1
- fi
要正常使用以上脚本,需要注意以下事项:
1、 /tmp/domain_list.txt 填写需要监控的域名,/tmp/${domain}_online_ip.txt填写对应域名的所有A记录。
2、根据bind设置修改脚本中的三个变量
- domain=www.75271.com
- keyname=rndc-key
- keysecret=gAnBYq6xSv7FKTZFmzAD0Q==
3、在named.conf文件中的zone添加如下代码:
- allow-update {key rndc-key;};
rndc-key修改为自己的。