1 基本概念
服务安装部署的五个步骤:
拷贝安装包到远端主机、创建安装目录并解压安装包、格式化磁盘挂载数据目录、修改服务配置文件、启动服务并验证集群运行状态
不论安装何种服务,大都需经历类似过程。
一键启停及状态检测:
1.日常维护中一键启停服务和实时获取服务运行状态的需求。
2.通过脚本实现管理主机一键启动或停止所有服务,以及获取服务运行状态的功能。
2 分布式集群脚本安装与部署前准备
2.1 安装部署脚本框架
#!/bin/bash
#
HOST_LIST="node01 node02 node03"
# 关闭firewalld和selinux
# 安装JDK
# 安装配置zookeeper,并启动服务
# 安装配置kafka,并启动服务
2.2 多主机执行指令函数封装
$@代表脚本或命令行中所有的参数、$#表示传递给脚本的参数数量。
HOST_LIST="node01 node02 node03"
USER_PASS="000000"
CMD_NUM=0
# 多主机执行主机指令封装
function remote_execute
{
for host in $HOST_LIST;do
CMD_NUM=`expr $CMD_NUM + 1`
echo "$CMD_NUM ++++command < $@ > in host: $host"
sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host $@
if [ $? -eq 0 ];then
echo "successful.command < $@ > "
else
echo "sorry.command < $@ > "
fi
done
}
remote_execute "df -h"
2.3 利用exec管理安装部署日志
利用exec指令管理脚本中的日志记录。通过判断每条指令执行的成功与否,成功则输出结果,失败则记录错误。对于日志记录,通常使用追加重定向的方式记录到特定log文件中。
所有后续的输出(无论是正常输出还是错误输出)都会被追加到 ./output.log
文件中,而不是显示在终端上。
if [-e ./output.log ];then
rm -rf ./output.log
fi
exec 1>> ./output.log 2>&1
exec
:执行一个命令,替换当前shell进程。1>>
:这是重定向操作符,用于将文件描述符1(通常是标准输出stdout)追加到文件中。如果文件不存在,它会被创建。./output.log
:这是要追加输出的目标文件路径。2>&1
:这是另一个重定向操作符,它将文件描述符2(通常是标准错误stderr)重定向到文件描述符1的当前位置。这意味着标准错误会被发送到标准输出的同一个位置,通常是同一个文件或同一个终端。
不用每一次都重定向到log日志中。
2.4 永久关闭selinux和firewalld
1.执行脚本后,防火墙和SELinux成功关闭和禁用。
2.通过命令执行结果确认firewalld和SELinux的禁用状态。
# 关闭firewalld和selinux
function stop_firewalld
{
remote_execute "systemctl stop firewalld"
remote_execute "systemctl disable firewalld"
remote_execute "setenforce 0"
remote_execute "sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux"
}
stop_firewalld
2.5 多主机传输文件函数封装
scp进行传输文件示例
LOCAL_DIR="/opt/tmp"
PACKAGE_DIR="/opt/package"
APP_DIR="/opt/source"
JDK_NAME="jdk-8u212-linux-x64.tar.gz"
for host in $HOST_LIST;do
scp -o StrictHostKeyChecking=no $LOCAL_DIR/$JDK_NAME root@$host:$PACKAGE_DIR
done
实现文件传输功能:
function remote_transfer
{
SRC_FILE=$1
DST_DIR=$2
# 函数必须有2个参数,第一个参数是本地文件或目录,第二个参数为远端主机目录
if [ $# -lt 2 ];then
echo "Usage:$0 <file|dir <dst_dir>>"
exit 1
fi
for host in $HOST_LIST;do
scp -o StrictHostKeyChecking=no $SRC_FILE root@$host:$DST_DIR
done
}
remote_transfer output.log /tmp
完善脚本,对不存在的目录或文件进行提示或创建:
function remote_transfer
{
SRC_FILE=$1
DST_DIR=$2
# 函数必须有2个参数,第一个参数是本地文件或目录,第二个参数为远端主机目录
if [ $# -lt 2 ];then
echo "Usage:$0 <file|dir <dst_dir>>"
exit 1
fi
# 判断第一个参数是否存在,如果不存在则直接退出并提示给用户
if [ ! -e $SRC_FILE ];then
echo "ERROR - $SEC_FIEL is not exist,Please check...."
exit 1
fi
for host in $HOST_LIST;do
echo "+++++++++++Transfer FILE TO HOST: $host+++++++++++"
CMD_NUM=`expr $CMD_NUM + 1`
# 判断目录参数是否存在,如果不存在则直接创建
ssh -o StrictHostKeyChecking=no root@$host "if [ ! -e $DST_DIR ];then mkdir $DST_DIR -p;fi"
scp -r -o StrictHostKeyChecking=no $SRC_FILE root@$host:$DST_DIR/
if [ $? -eq 0 ];then
echo "Remote Host:$host - $CMD_NUM - INFO -SCP $SRC_FILE TO dir $DST_DIR success"
else
echo "Remote Host:$host - $CMD_NUM - ERROR -SCP $SRC_FILE TO dir $DST_DIR filed"
fi
done
}
remote_transfer output.log /tmp/log
验证:
cat /tmp/log/output.log