用于减少操作人员安装软件的时间,将zookeeper软件的安装写成脚本形式,可以降低操作复杂性,提高可移植性。
一、脚本前准备
1、zookeeper软件下载
下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
本文做测试的zookeeper版本为 zookeeper-3.4.13
2、zookeeper自定义配置文件
touch zookeeper_install.conf
之后在zookeeper_install.conf中配置需要配置zookeeper多台服务器的DNS,用户名和myid。
这里没有根据/etc/hosts文件进行dns匹配是因为由于线上的hosts文件中可能存在多个与配置无关的dns,我们再conf中只配置需要安装zookeeper的dns。
hadoop1 hadoop 1
hadoop2 hadoop 2
hadoop3 hadoop 3
3、配置免密登录
如果机器没有配置免密登录,可以参照我的自动化ssh文章
https://blog.csdn.net/a763470525/article/details/82888510
二、脚本执行格式
脚本需要传递三个参数:
这里注意传递参数为绝对路径
第一参数是zookeeper安装包位置:/home/hadoop/packages/zookeeper-3.4.13.tar.gz
第二参数是zookeeper安装位置:/home/hadoop/apps
第三参数是zookeeper自定义配置文件位置:/home/hadoop/shell/zookeeper/zookeeper_install.conf
sh zookeeper_install.sh /home/hadoop/packages/zookeeper-3.4.13.tar.gz /home/hadoop/apps /home/hadoop/shell/zookeeper/zookeeper_install.conf
三、脚本细节及解读
#!/bin/bash
# 将安装包解压到安装位置,不输出日志
tar -zxvf $1 -C $2 >/dev/null 2>&1
# 存储配置文件
# hadoop1 hadoop 1
# hadoop2 hadoop 2
# hadoop3 hadoop 3
CONFIG=$3
# 进入安装位置,在文件位置获取到解压后的文件名如zookeeper-3.4.13
cd $2
ZOOKEEPER_PARENT=`pwd`
ZOOKEEPER_OLDNAME=`ls | grep "zookeeper"`
ZOOKEEPER_OLD_PATH="${ZOOKEEPER_PARENT}/${ZOOKEEPER_OLDNAME}"
ZOOKEEPER_NEW_PATH="${ZOOKEEPER_PARENT}/zookeeper"
# 将zookeeper-3.4.13文件名改成zookeeper
mv ${ZOOKEEPER_OLD_PATH} ${ZOOKEEPER_NEW_PATH}
# 进入zookeeper文件夹内
cd $ZOOKEEPER_NEW_PATH
# 获取ZOOKEEPER_HOME
ZOOKEEPER_HOME=`pwd`
modify_profile_and_myid(){
# 获取profile位置
PROFILE="$HOME/.bash_profile"
cat $CONFIG | while read line
do
# 从自定义配置文件中获取到DNS,用户名,myid
DNS=`echo $line | cut -d ' ' -f 1`
USERNAME=`echo $line | cut -d ' ' -f 2`
MYID=`echo $line | cut -d ' ' -f 3`
if [ "$1" == "step1" ]
then
# 将一下内容写入zoo.cfg
# server.1=hadoop1:2888:3888
# server.2=hadoop2:2888:3888
# server.3=hadoop3:2888:3888
echo "server.${MYID}=${DNS}:2888:3888" >> $2
elif [ "$1" == "step2" ]
then
if [ ${MYID} -eq 1 ]
then
# 将~/.bash_profile进行修改
# ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper
# PATH=$PATH:$HOME/.local/bin:$HOME/bin:
# $JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
sed -i /PATH=/i\\ZOOKEEPER_HOME=${ZOOKEEPER_HOME} ${PROFILE}
sed -i '/^PATH=/s/$/:\$ZOOKEEPER_HOME\/bin/' ${PROFILE}
else
# 将第一台机器的~/.bash_profile拷贝到其他机器中
scp -r ${PROFILE} ${USERNAME}@${DNS}:"$HOME"
fi
# 将每台机器上的~/.bash_profile生效
ssh -n ${USERNAME}@${DNS} "source ${PROFILE}"
elif [ "$1" == "step3" ]
then
if [ ${MYID} -ne 1 ]
then
# 将第一台机器上的zookeeper文件夹拷贝到其他机器上
scp -r ${ZOOKEEPER_HOME} ${USERNAME}@${DNS}:"${ZOOKEEPER_PARENT}"
fi
else
# 将其他机器上的myid进行修改
ssh -n $USERNAME@$DNS "cd ${ZOOKEEPER_HOME}/data; echo "${MYID}" > ${ZOOKEEPER_HOME}/data/myid"
fi
done
}
# 进入zookeeper中的conf文件夹下,创建zoo.cfg,并将datadir和logdir填入zoo.cfg
cd "${ZOOKEEPER_HOME}/conf"
cp zoo_sample.cfg zoo.cfg
sed -i /dataDir=/d zoo.cfg
echo "dataDir=${ZOOKEEPER_HOME}/data" >> zoo.cfg
echo "dataLogDir=${ZOOKEEPER_HOME}/log" >> zoo.cfg
# 执行步骤1将server.1=hadoop1:2888:3888对应内容存入zoo.cfg
modify_profile_and_myid "step1" "zoo.cfg"
# 执行步骤2将多台机器上的~/.bash_profile进行修改
modify_profile_and_myid "step2"
# 修改datadir和logdir的权限
cd ${ZOOKEEPER_HOME}
mkdir -m 755 data
mkdir -m 755 log
# 执行步骤3将zookeeper文件夹拷贝到其他机器
modify_profile_and_myid "step3"
# 执行步骤4修改myid
modify_profile_and_myid "step4"