Linux文件分发脚本

时间:2022-02-14 08:48:06

在集群部署、运维时,经常需要把同一份文件复制到其他主机上,以保证各主机的配置是一致的,单个进行scp操作,几台主机还能接受,当有几十台甚至上百机器的集群时,单个scp就会非常的耗时,严重降低了工作效率,下面就是一份文件分发到各主机的脚本,非常的方便使用。


为了分解分发的时候更加快捷方便的使用,集群内部的主机最好已经做好互信,

互信命令:

  1.生成公钥:

ssh-keygen  回车

 2.复制公钥到各主机,配置互信:

   ssh-copy-id-i     /home/root/.ssh/id_rsa.pub  root@$hostname


分发脚本deploy-file.sh内容:

#!/bin/bash

#set -x

if [ $# -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



结束。。。。