版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27232757/article/details/80031277
功能描述:可以部署zookeeper的单机模式和集群模式,集群模式默认会在脚本所在机器部署一个节点,也就是说想要部署三个节点的ZK集群,只需要输入两个IP。
#!/bin/bash
#authro likexin
#description deploy standalone or cluster zookeeperLOCALHOST=`ifconfig | grep "inet" | awk 'NR==1{print}' | awk '{print $2}'`
#部署集群模式的zookeeper
function installClusterZK() {
read -p "`echo -e "\033[35mPlease enter the ip(ip;ip;ip):\033[0m"`" ips
echo -e "\033[32m################开始部署ZK集群################\033[0m"
#检查路径
checkPath $1 $2
#拷贝安装源到目标路径
cp $1 $2
#解压安装源
name=`echo $1 |awk -F'/' '{print $NF}'`
cd $2;tar -zxvf $name > /dev/null
#修改配置文件
dir=`echo $name |awk -F'.tar.gz' '{print $1}'`
modifyConf $2/$dir $3
quantity=`echo $ips | awk -F';' '{print NF}'`
port1=$(($3+1))
port2=$(($3+2))
info="server.$(($quantity+1))=$LOCALHOST:$port1:$port2"
echo $info >> zoo.cfg
for (( i=1; i<=$quantity; i++))
do
ip=`echo $ips | awk -v nvar=$i -F';' '{print $nvar}'`
info="server.$i=$ip:$port1:$port2"
echo $info >> zoo.cfg
done
#部署zookeeper集群
for (( i=1; i<=$quantity; i++))
do
ip=`echo $ips | awk -v nvar=$i -F';' '{print $nvar}'`
echo $ip
echo $i > $2/$dir/myid
ssh $USER@$ip "[ -d $2 ] && echo ok || mkdir -p $2"
scp -r $2/$dir $USER@$ip:$2/$dir > /dev/null
scp -r $2/$dir/myid $USER@$ip:$2/$dir/myid
ssh $USER@$ip "cd $2/$dir/bin; ./zkServer.sh start"
done
echo $(($quantity+1)) > $2/$dir/myid
$2/$dir/bin/zkServer.sh start
echo -e "\033[32m################部署成功################\033[0m"
}
#部署单节点的zookeeper
function installStandaloneZK() {
echo -e "\033[32m################开始部署################\033[0m"
#检查路径
checkPath $1 $2
#拷贝安装源到目标路径
cp $1 $2
#解压安装源
name=`echo $1 |awk -F'/' '{print $NF}'`
cd $2;tar -zxvf $name > /dev/null
#修改配置文件
dir=`echo $name |awk -F'.tar.gz' '{print $1}'`
modifyConf $2/$dir $3
#启动zookeeper
$2/$dir/bin/zkServer.sh start
echo -e "\033[32m################部署成功################\033[0m"
}
#修改zookeeper的配置文件
function modifyConf() {
cd $1/conf
#备份原始的配置文件
if [ ! -f $1/conf/zoo.cfg ];then
cp zoo_sample.cfg conf/zoo.cfg
fi
#修改配置文件
sed -i -e "s#clientPort=[0-9]*#clientPort=$2#g" -e "s#dataDir=\/tmp\/zookeeper#dataDir=$1#g" zoo.cfg
}
#检查安装源是否存在,检查部署路径是否存在
function checkPath() {
if [ ! -f $1 ];then
echo -e "\033[31mThe installation source does not exist\033[0m"
exit 1
fi
if [ ! -d $2 ];then
mkdir $2
fi
}
#判断路径是不是绝对路径
function isLegalPath() {
firstChar=`echo $1 |awk '{print substr($0,1,1)}'`
if [ ! "$firstChar" = "/" ];then
echo -e "\033[31mPlease enter the absolute path.\033[0m"
exit 1
fi
}
#判断端口号是否合法
function isLegalPort() {
if (( $1 > 65535 ));then
echo -e "\033[31mOut of port range.\033[0m"
exit 1
fi
}
#等待用户输入安装源的目录、安装路径、端口号(检查是否合法)
read -p "`echo -e "\033[35mPlease enter the installation source path:\033[0m"`" source
isLegalPath $source
read -p "`echo -e "\033[35mPlease enter the target path:\033[0m"`" path
isLegalPath $path
read -p "`echo -e "\033[35mPlease enter the port:\033[0m"`" port
isLegalPort $port
read -p "`echo -e "\033[35mPlease enter the zookeeper type:\033[0m"`" type
case $type in
"standalone")
installStandaloneZK $source $path $port
;;
"cluster")
installClusterZK $source $path $port
;;
*)
echo -e "\033[33mUsage : {standalone|cluster}\033[0m"
;;
esac