使用dnsmasq解决多套测试环境的host绑定

线上线下的多套环境,线上环境N多个机房,每个机房几百个公网IP,机房建设前期的需要给测试提供host列表。为方便在新机房启用前测试快速切换到不同的环境,就试用了一下dnsmasq,觉得还是不错的。

centos5.8自带的版本比较老,就直接下载的源码包编译了一下,编译后只拷出来了dnsmasq程序本身。新搞了个目录按照下面的格式存放。

bin/dnsmasq

dnsmasq.conf

dnsmasq.hosts

failquery.pl

restart.sh
resolv.conf

主配置文件如下

#dnsmasq.conf

user=pm
no-hosts
addn-hosts=/home/pm/dnsmasq/dnsmasq.hosts
resolv-file=/home/admin/dnsmasq/resolv.conf
cache-size=1500
local-ttl=10
max-ttl=10
log-queries

restart.sh
#resolv.conf
nameserver 192.15.48.1
nameserver 192.15.48.2
[bash]

#!/bin/bash
PRE=/home/pm/dnsmasq
killall dnsmasq    &>/dev/null

$PRE/bin/dnsmasq  -x $PRE/dnsmasq.pid  -C $PRE/dnsmasq.conf -8 $PRE/dns.log -D
killall -0 dnsmasq && echo "dnsmasq start ok" || echo "dnsmasq start failed" [/bash]

每次改了配置直接运行一下restart脚本就行了。

因为开启了日志记录,所以随便写了个perl脚本分析日志,可以查看到测试同学访问时我配置的host文件是不是又漏掉的。

[pl]

#!/usr/bin/perl
use strict;
use warnings;
my %error;
my %lack;
my $reg=qr/xxx.com|yyyy.com/;#只分析这两个域的域名
my $DNSLOG="/home/pm/dnsmasq/dns.log";
open my $LOG,"<$DNSLOG" or die "open dns log failed!\n";
while (my $line=<$LOG>){
 if($line=~/NXDOMAIN/){
  if($line=~/]:\s+\w+\s+([\w\.]+)\s+/){
   my $do=$1;
   $error{$do}++ if ( $do=~/$reg/) ;
  }
 }
 if($line=~/forwarded/){
  if($line=~/]:\s+\w+\s+([\w\.]+)\s+/){
   my $do=$1;
   $lack{$do}++ if ($do=~/$reg/);
  }
 }

}

close $LOG;

my @t=keys%error;
delete @lack{@t};
if( keys%lack >0){
 print "\e[31mhosts lack some domains:\e[m\n";
 print  "\e[1;33m",join("\n",keys%lack),"\e[m\n**************\n"
}
if( keys%error >0){
 print "\e[32msome query domains not exist:\e[m\n";
 print join("\n",keys%error),"\n**************\n"
}[/pl]

此条目发表在System分类目录。将固定链接加入收藏夹。

发表评论