集群脚本的准备
最近在学zookeeper,发现scp这东西真好用,可以给其他节点传输文件,非常的方便。但是拷贝文件到各个节点,节点数量少还是挺方便的,但是节点一多起来,就会发现重复的工作增加了好多,相同的命令需要输入好多次,而且接受的用户名如果改错了还会浪费时间。所以每次都用scp远程命令去拷贝不现实,所以现在编写一个分发脚本,单命令可以分发到各个节点。(以下是三台已经互相ssh免密登录的虚拟机centos7)
1.创建/home/hadoop/tools 脚本存放目录(以下所有需要在hadoop用户下执行)
mkdir ~/tools
tools文件夹
多用户的坑:
2.编写脚本配置文件 deploy.conf and deploy.sh
进入刚创建好的文件夹,编写deploy.conf
cd ~/tools
vim deploy.conf
#规划各个节点的角色(用于后面你想分发到哪个角色的节点)
ESC + :wq (退出)
编写deploy.sh(ssh的脚本)
vim deploy.sh
下面的shell传递参数(可以去菜鸟教程学习)
#!/bin/bash #默认写法脚本识别
if [ $# -lt 3 ] #如果参数个数小于三
then
echo "Usage: ./deploy.sh srcFile(or Dir) destFile(or Dir) MachineTag" #提示脚本如何运行(三个参数用法 文件名 目的地 节点角色)
echo "Usage: ./deploy.sh srcFile(or Dir) destFile(or Dir) MachineTag confFile" #提示脚本如何运行(四个参数用法 文件名 目的地 节点角色 )
exit
fi
src=$1 #文件名是第一个参数
dest=$2 #目的地是第二个参数
tag=$3 #角色是第三个参数
if [ 'a'$4'a' == 'aa' ] #第四个参数是否为空
then
confFile=/home/hadoop/tools/deploy.conf #第四个参数为空confFile 为默认配置文件
else
confFile=$4 #配置文件是第四个参数
fi #结束if语句
if [ -f $confFile ] #配置文件是否存在且为普通文件
then
if [ -f $src ] #是文件,存在且为普通文件
then
for server in `cat $confFile | grep -v '^#' | grep ','$tag','|awk -F ',' '{print $1}'` #for 集群节点 in ‘获取整个confFile | 取反 把井号开头的注释去掉 | 取两个‘,’包含的角色 | 利用解析‘,’ print 第一个参数(即节点名称)’ (最终效果是获取到有tag$3角色的节点名称)
do
scp $src $server":"${dest} #将文件 通过scp分发到每个节点的具体地址上去
done
elif [ -d $src ] #是文档,存在且为普通文档
then
for server in `cat $confFile | grep -v '^#' | grep ','$tag','|awk -F ',' '{print $1}'`#for 集群节点 in ‘获取整个confFile | 取反 把井号开头的注释去掉 | 取两个‘,’包含的角色 | 利用解析‘,’ print 第一个参数(即节点名称)’ (最终效果是获取到有tag$3角色的节点名称)
do
scp -r $src $server":"${dest} #将文档 通过scp分发到每个节点的具体地址上去
done
else
echo "Error: No source directory or file exists" #提示该文件或文档不存在
fi #结束if语句
else
echo "Error: Plesase assign config file or run deploy.sh command with deploy.conf in same directory" #出错了提示配置文件不存在或不为普通文件,需要指定配置文件
fi #结束if语句
3.给脚本添加执行权限
chmod u+x ~/tools/deploy.sh
ll
你会发现文件颜色变成了绿色
4.配置脚本环境变量
配置环境变量是个坑
1./etc/profile文件为系统的每个用户设置环境变量信息,此文件的修改会影响到所有用户。想了解更多细节内容可以用:vim /etc/profile 命令进行查看。
vim /etc/profile
2.~/.bashrc文件是针对当前用户,其他用户不会受影响(我们选择这个在hadoop用户下进行)
vim ~/.bashrc
把最后两行加进去
[hadoop@hadoop01 tools]$ vim ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
PATH=/home/hadoop/tools:$PATH
export PATH
ESC + :wq(退出)
然后source环境文件
source ~/.bashrc
你的deploy.sh就可以使用了
带着你试试。
先随便创建一个文件1.txt
然后再把1.txt分发到角色为slave各个节点中
vim 1.txt
#随便写点东西
deploy.sh 1.txt /home/hadoop/ slave
#deploy.sh 文件名 目的地 节点角色
然后去hadoop02 ,hadoop03 节点看或者你自己填的slave角色节点看。
你会发现已经传过来了。
5.编写集群远程执行脚本
runRemoteCmd.sh
这个脚本有了上面得基础,写的就会如鱼得水,而且这个更为简单。
#!/bin/bash #默认写法脚本识别
if [ $# -t 2 ] #如果参数小于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 $conFile ] #判断环境参数文件是否存在且为普通文件
then
for server in `cat $confFile | grep -v '^#' | grep ','$tag','|awk -F ',' '{print $1}'`
#for 集群节点 in ‘获取整个confFile | 取反 把井号开头的注释去掉 | 取两个‘,’包含的角色 | 利用解析‘,’ print 第一个参数(即节点名称)’ (最终效果是获取到有tag$3角色的节点名称)#
do
echo "*****************$server*****************************"
ssh $server "source ~/.bashrc; $cmd" #远程source环境变量,并且执行命令
done
else
echo "Error: Plesase assign config file or run deploy.sh command with deploy.conf in same directory" #环境参数文件不存在或不为普通文件
fi
然后保存
接下来使用一下这个远程脚本给各个节点创建文档。
"mkdir ~/apps" all
十分成功,这就是两个脚本的编写。
不要再用scp 命令一个节点一个节点去传文件,每个节点输入同样的命令浪费时间了
一起来编写脚本吧!!!!