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;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
  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;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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值