需求: 启动服务的时候,有时候需要每个节点都要启动,所以很麻烦。所以通过脚本的配置在一个节点上启动其他节点的服务,或者同时启动用一种角色节点的服务
在学习的过程中,因为遇到每个节点都要启动相同的服务。反复操作很繁琐,所以为了节省效率,找到了一些脚本用来方便操作,这里简单讲一些。(脚本不是自己写的。也是网上找的资源,这里只是做一下思路分析。)
思路: 将每个节点与其对应的角色在文件中配置好与主机名对应,通过读取文件获取服务的角色,这里需要注意每个节点的软件安装目录,环境变量以及 文件和数据目录应当是相同的。
为了使得脚本位置发生改变的时候相对来说位置不变,应当将配置文件 ,读取配置的脚本文件放在同一个目录下,这里我把它们放在tools目录下
文件目录:
tools
->deploy.conf //主机与角色的对应关系
->runRemoteCmd.sh //启动不同角色服务的脚本
->deploy.sh //向不同角色的节点分发文件的脚本
第一步: 配置主机与角色对应的文件:
deploy.conf
txynebo1,all,namenode,zookeeper,resourcemanager,
txynebo2,all,slave,namenode,zookeeper,resourcemanager,
txynebo3,all,slave,datanode,zookeeper,
上面的配置是我三个节点的集群角色配置,因为我主要在主节点上执行,所以这样配置也可以根据自己的需求,进行不同的配置。
第二步: 文件(夹)拷贝脚本
deploy.sh
#!/bin/bash
#set -x
if [ $# -lt 3 ]
then
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
exit
fi
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$4
fi
if [ -f $confFile ]
then
if [ -f $src ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
scp $src $server":"${dest}
done
elif [ -d $src ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
scp -r $src $server":"${dest}
done
else
echo "Error: No source file exist"
fi
else
echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
可以看到需要传递三个参数, 原文件(夹),目标文件(夹), 传递到的角色节点。(第四个为角色配置文件,如果不传递,则为默认位置,因为该配置文件与该脚本在同一个目录下,所以也可以使用相对定位,这里直接使用绝对路径)。
第三步: 服务启动脚本
runRemoteCmd.sh
#!/bin/bash
#set -x
if [ $# -lt 2 ]
then
echo "Usage: ./runRemoteCmd.sh Command MachineTag"
echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
exit
fi
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$3
fi
if [ -f $confFile ]
then
for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
do
echo "*******************$server***************************"
ssh $server "source /etc/profile; $cmd"
done
else
echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
可以看出上面脚本需要传递两个参数,一个是执行脚本的路径+参数 ,一个是 执行的启动的角色
如:
/home/hadoop/tools/runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" all
总结:这些脚本也是在学习过程中发现的比较好用的脚本,所以分享一下。这里不再对具体的命令做详细的解释。
需要注意的是,因为用的是ssh免密通信启动服务,所以需要配置好ssh免密。然后就是各个角色的服务是一起启动的,所以相同角色节点的文件目录务必保证相同。