欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > shell编程:利用SSH实现分布式应用的一键安装部署①(多主机执行指令函数封装、日志输出、关闭防火墙、传输文件函数封装)

shell编程:利用SSH实现分布式应用的一键安装部署①(多主机执行指令函数封装、日志输出、关闭防火墙、传输文件函数封装)

2026/6/2 17:12:42 来源:https://blog.csdn.net/m0_60125201/article/details/141026569  浏览:    关键词:shell编程:利用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
  1. exec:执行一个命令,替换当前shell进程。
  2. 1>>:这是重定向操作符,用于将文件描述符1(通常是标准输出stdout)追加到文件中。如果文件不存在,它会被创建。
  3. ./output.log:这是要追加输出的目标文件路径。
  4. 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词