利用SSH实现分布式应用的一键安装部署①(多主机执行指令函数封装、日志输出、关闭防火墙、传输文件函数封装)
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;doCMD_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 ];thenecho "successful.command < $@ > "elseecho "sorry.command < $@ > "fidone
}remote_execute "df -h"
2.3 利用exec管理安装部署日志
利用exec指令管理脚本中的日志记录。通过判断每条指令执行的成功与否,成功则输出结果,失败则记录错误。对于日志记录,通常使用追加重定向的方式记录到特定log文件中。
所有后续的输出(无论是正常输出还是错误输出)都会被追加到 ./output.log
文件中,而不是显示在终端上。
if [-e ./output.log ];thenrm -rf ./output.log
fiexec 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;doscp -o StrictHostKeyChecking=no $LOCAL_DIR/$JDK_NAME root@$host:$PACKAGE_DIR
done
实现文件传输功能:
function remote_transfer
{SRC_FILE=$1DST_DIR=$2# 函数必须有2个参数,第一个参数是本地文件或目录,第二个参数为远端主机目录if [ $# -lt 2 ];thenecho "Usage:$0 <file|dir <dst_dir>>"exit 1fifor host in $HOST_LIST;doscp -o StrictHostKeyChecking=no $SRC_FILE root@$host:$DST_DIRdone
}remote_transfer output.log /tmp
完善脚本,对不存在的目录或文件进行提示或创建:
function remote_transfer
{SRC_FILE=$1DST_DIR=$2# 函数必须有2个参数,第一个参数是本地文件或目录,第二个参数为远端主机目录if [ $# -lt 2 ];thenecho "Usage:$0 <file|dir <dst_dir>>"exit 1fi# 判断第一个参数是否存在,如果不存在则直接退出并提示给用户if [ ! -e $SRC_FILE ];thenecho "ERROR - $SEC_FIEL is not exist,Please check...."exit 1fifor host in $HOST_LIST;doecho "+++++++++++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 ];thenecho "Remote Host:$host - $CMD_NUM - INFO -SCP $SRC_FILE TO dir $DST_DIR success"elseecho "Remote Host:$host - $CMD_NUM - ERROR -SCP $SRC_FILE TO dir $DST_DIR filed"fidone
}remote_transfer output.log /tmp/log
验证:
cat /tmp/log/output.log