在集群部署、运维时,经常需要把同一份文件复制到其他主机上,以保证各主机的配置是一致的,单个进行scp操作,几台主机还能接受,当有几十台甚至上百机器的集群时,单个scp就会非常的耗时,严重降低了工作效率,下面就是一份文件分发到各主机的脚本,非常的方便使用。
为了分解分发的时候更加快捷方便的使用,集群内部的主机最好已经做好互信,
互信命令:
1.生成公钥:
ssh-keygen 回车
2.复制公钥到各主机,配置互信:
ssh-copy-id-i /home/root/.ssh/id_rsa.pub root@$hostname
分发脚本deploy-file.sh内容:
#!/bin/bash
#set -xif [ $# -lt 3 ] #输入的参数个数小于3各,提示该脚本的使用语法
then
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag" #用法: ./deply.sh 源文件/目录 目的文件/目录 主机名(all 表示读取配置文件里的所有主机)
echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile" #用法: ./deply.sh 源文件/目录 目的文件/目录 主机标签 配置文件名称
exit
fi
src=$1 #源文件/目录
dest=$2 #目的文件/目录
tag=$3 #主机标签(主机名)(all表示配置文件所有主机,即读取配置文件hostlist.conf)
if [ 'a'$4'a' == 'aa' ] #读取主机列表配置文件
then
confFile=/hadoop/ hostlist.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
echo "-----------------------------$server----------------------"
scp $src $server":"${dest} #scp操作,把文件复制到目的主机对应的路径下
done
elif [ -d $src ] #源文件存在,且源文件是目录,scp的时候需要加-r参数
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
# --------------------脚本内容结束-------------------------------------------------
主机列表配置文件,hostlist.conf(纯文本配置文件),主要配置需要分发到的主机的主机名(确保本机可以解析该主机名和IP地址的对应关系)或者IP地址
#hostname or ip
HD-BATCH-001,all
HD-BATCH-002,all
。。。
。。。
HD-BATCH-119,all
HD-BATCH-120,all
结束。。。。