bash的运行模式可分为
login shell
(用户名、密码登录)和non-login shell
(SSH登录)。
两者登录方式加载情况:
1.login shell启动时会加载:/etc/profile,~/.bash_profile,~/.bashrc
2.non-login shell启动时会加载:~/.bashrc
注意:~/.bashrc
实则会加载/etc/bashrc
,/etc/bashrc
又加载/etc/profile.d/*.sh
SSH登录注意:
当SSH到其他节点的时候是使用
non-login shell
模式,默认是不加载/etc/profile
配置文件,也就会导致环境变量信息未配置,从而会找不到部分命令的问题
创建
/root/shell
目录,用于存放shell脚本
在
/etc/bashrc
文件配置shell脚本目录,将其作为环境变量,以便在任何地方使用新建的shell脚本
# My Shell
export PATH=$PATH:/root/shell
配置每个节点的hosts文件,设置节点IP与Name的映射。
vim /etc/hosts
172.29.234.1 node01
172.29.234.2 node02
172.29.234.3 node03
172.29.234.4 node04
172.29.234.5 node05
执行脚本来自动配置各个节点免密登录。
vim ssh_config.sh
#! /bin/bash
function sshPasswordLogin() {
# 检测expect服务是否存在,不存在则使用yum安装expect
expectIsExists=$(rpm -qa | grep expect)
if [ -z "$expectIsExists" ]; then
yum -y install expect
fi
# 密钥对不存在则创建密钥
if [ ! -f /root/.ssh/id_rsa.pub ]; then
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
fi
# 服务器列表
# servers=("IP地址1 用户名1 密码1" "IP地址2 用户名2 密码2" "IP地址3 用户名3 密码3")
servers=("node01 root 123456" "node02 root 123456" "node03 root 123456" "node04 root 123456" "node05 root 123456")
for server in "${servers[@]}"; do
hostname=$(echo "$server" | cut -d " " -f1)
username=$(echo "$server" | cut -d " " -f2)
password=$(echo "$server" | cut -d " " -f3)
echo "Configuring password login on $hostname..."
expect <<EOF
spawn ssh-copy-id "$username@$hostname"
expect {
"yes/no" {
send "yes\n"
exp_continue
}
"password" {
send "$password\n"
exp_continue
}
eof
}
EOF
done
}
sshPasswordLogin
更改执行权限
chmod +x ssh_config.sh
在各个节点执行ssh_config.sh脚本,然后就会自动进行SSH互相配置密码登录
[root@node01 ~]# ./ssh_config.sh
[root@node02 ~]# ./ssh_config.sh
[root@node03 ~]# ./ssh_config.sh
[root@node04 ~]# ./ssh_config.sh
[root@node05 ~]# ./ssh_config.sh
rsync 是一个功能强大的文件同步和复制工具,可以在本地或远程服务器之间进行文件传输和备份。
通过运行以下命令安装
# CentOS/RHEL
yum install rsync
# Ubuntu/Debian
apt-get install rsync
1.本地文件复制:
把source 目录下的文件复制到 destination 目录
rsync /path/to/source/file /path/to/destination/
2.本地目录复制:
使用 -a 参数表示递归复制目录,-v 参数表示显示详细的复制过程
rsync -av /path/to/source/directory/ /path/to/destination/directory/
3.本地文件同步:
使用 --delete 参数可以保持源和目标目录的同步,删除目标目录中不存在于源目录的文件
rsync -av --delete /path/to/source/directory/ /path/to/destination/directory/
4.远程文件复制:
通过 SSH 连接复制本地文件到远程服务器。-z 参数表示使用压缩来加速传输
rsync -avz -e "ssh" /path/to/local/file user@remote:/path/to/destination/
5.远程目录复制:
rsync -avz -e "ssh" /path/to/local/directory/ user@remote:/path/to/destination/directory/
将指定的文件传输到每个指定的主机节点,在传输之前,会检查文件是否存在,然后创建相应的目录并使用 rsync 进行传输。
这个脚本将循环复制当前节点指定目录下的文件到其他节点的相同路径下
vim sync.sh
#! /bin/bash
# 检查是否提供了足够的命令行参数
if [ $# -lt 1 ]; then
echo Not Enough Arguement!
exit
fi
# 遍历集群所有机器
for host in node01 node02 node03 node04 node05; do
echo ==================== $host ====================
# 遍历所有目录,挨个发送
for file in $@; do
# 检查文件是否存在
if [ -e $file ]; then
# 获取父目录
pdir=$(
cd -P $(dirname $file)
pwd
)
# 获取当前文件的名称
fname=$(basename $file)
# 在远程主机执行创建目录的命令
ssh $host "mkdir -p $pdir"
# 将文件传输到远程主机的相应目录
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
更改执行权限
chmod +x sync.sh
使用文件同步脚本,进行分发同步hosts配置信息
[root@node01 ~]# sync.sh /etc/hosts
遍历服务器名称列表,然后在每台服务器上运行指定的命令
#! /bin/bash
for i in node01 node02 node03 node04 node05
do
echo --------- $i ----------
ssh $i "$*"
done
更改执行权限
chmod +x call.sh
使用示例
call.sh jps
使用命令执行脚本,在每个节点执行指定的命令
[root@node01 ~]# call.sh jps
定义一个hosts文件
node01
node02
node03
node04
node05
以命令执行脚本简化为例说明:
#!/bin/bash
for host in `cat /root/hosts` ;
do
# tput命令,用于设置终端输出的文本颜色为绿色
tput setaf 2
echo ======== $host ========
# 将终端输出的文本颜色重置为默认颜色
tput setaf 7
ssh $host "$@"
done
vim hadoop.sh
#!/bin/bash
# Hadoop安装目录
HADOOP_HOME="/usr/local/program/hadoop"
# namenode分配节点
NAMENODE="node01"
COMMAND=""
if [ $# -lt 1 ]; then
echo "请输入命令参数 start 或 stop"
exit
fi
case $1 in
"start")
echo "=================== 启动 Hadoop 集群 ==================="
echo "--------------- 启动 HDFS ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/start-dfs.sh"
echo "--------------- 启动 YARN ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/start-yarn.sh"
;;
"stop")
echo "=================== 关闭 Hadoop 集群 ==================="
echo "--------------- 关闭 YARN ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/stop-yarn.sh"
echo "--------------- 关闭 HDFS ---------------"
ssh $NAMENODE "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
启动、停止Hadoop
hadoop.sh start
hadoop.sh stop
vim zk.sh
#!/bin/bash
case $1 in
"start")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 启动----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh start"
done
;;
"stop")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 停止----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh stop"
done
;;
"status")
for i in node01 node02 node03; do
echo "----------------------zookeeper $i 状态----------------------"
ssh $i "/usr/local/program/zookeeper/bin/zkServer.sh status"
done
;;
*)
echo "无效的命令"
;;
esac
修改脚本执行权限
chmod +x zk.sh
启动、停止Zookeeper
zk.sh start
zk.sh stop
vim kafaka.sh
#!/bin/bash
if [ $# -eq 0 ]; then
echo "请输入命令参数 start 或 stop"
exit 1
fi
KAFKA_HOME="/usr/local/program/kafka"
case $1 in
"start")
for node in "node01" "node02" "node03"; do
echo "----------------------kafka $node 启动----------------------"
ssh $node "$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties"
# 通过$?获取上一个命令的执行状态。如果执行状态不为 0,则表示启动或停止失败
if [ $? -ne 0 ]; then
echo "启动 $node 失败"
fi
done
;;
"stop")
for node in "node01" "node02" "node03"; do
echo "----------------------kafka $node 停止----------------------"
ssh $node "$KAFKA_HOME/bin/kafka-server-stop.sh"
if [ $? -ne 0 ]; then
echo "停止 $node 失败"
fi
done
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
修改脚本执行权限
chmod +x kafaka.sh
启动、停止Kafaka
kafaka.sh start
kafaka.sh stop
创建vim flume.sh
集群启动停止脚本
#!/bin/bash
# flume执行节点
REMOTE_HOST="node01"
# flume-ng位置
FLUME_EXECUTABLE="/usr/local/program/flume/bin/flume-ng"
# flume配置目录
FLUME_CONF_DIR="/usr/local/program/flume/conf/"
# flume配置文件
FLUME_CONF_FILE="/usr/local/program/flume/job/file_to_kafka.conf"
# 执行进程名称
PROCESS_NAME="file_to_kafka"
case $1 in
"start")
echo " ---------------启动flume采集--------------"
ssh "$REMOTE_HOST" "nohup $FLUME_EXECUTABLE agent -n a1 -c \"$FLUME_CONF_DIR\" -f \"$FLUME_CONF_FILE\" >/dev/null 2>&1 &"
;;
"stop")
echo " ---------------停止flume采集--------------"
ssh "$REMOTE_HOST" "ps -ef | grep $PROCESS_NAME | grep -v grep |awk '{print \$2}' | xargs -n1 kill -9 "
;;
*)
echo "无效参数: $1"
echo "请输入: start 或 stop"
exit 1
;;
esac
修改脚本执行权限
chmod +x flume.sh
启动、停止Flume
flume.sh start
flume.sh stop