需求: 启动服务的时候,有时候需要每个节点都要启动,所以很麻烦。所以通过脚本的配置在一个节点上启动其他节点的服务,或者同时启动用一种角色节点的服务

在学习的过程中,因为遇到每个节点都要启动相同的服务。反复操作很繁琐,所以为了节省效率,找到了一些脚本用来方便操作,这里简单讲一些。(脚本不是自己写的。也是网上找的资源,这里只是做一下思路分析。)
思路: 将每个节点与其对应的角色在文件中配置好与主机名对应,通过读取文件获取服务的角色,这里需要注意每个节点的软件安装目录,环境变量以及 文件和数据目录应当是相同的。

为了使得脚本位置发生改变的时候相对来说位置不变,应当将配置文件 ,读取配置的脚本文件放在同一个目录下,这里我把它们放在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免密。然后就是各个角色的服务是一起启动的,所以相同角色节点的文件目录务必保证相同。