• 全部
  • 经验案例
  • 典型配置
  • 技术公告
  • FAQ
  • 漏洞说明
  • 全部
  • 全部
  • 大数据引擎
  • 知了引擎
产品线
搜索
取消
案例类型
发布者
是否解决
是否官方
时间
搜索引擎
匹配模式
高级搜索

GFS升级失败,gfs磁盘发生变化,恢复脚本;

2025-01-23 发表
  • 0关注
  • 0收藏 311浏览
粉丝:0人 关注:0人

问题描述

GFS升级失败,gfs磁盘发生变化,恢复脚本;

解决方法

#!/bin/bash
# 缺设备参数格式校验,设备是否存在,节点格式是否正确
curDir=$(dirname $(readlink -f "$0"))
Dir=$(dirname "$curDir")

NODE_NAMES=`kubectl  get node --selector="master" |grep -v "NAME" |grep master |awk '{print $1}' |tr "\n" " "`
ARRAY_NAMES=($NODE_NAMES)
NAMESPACES=glusterfs-example

#检测当前环境中role为Master的节点数量
TOKEN=`kubectl get configmap matrix -n matrix -o jsOnpath={.data.MATRIX_INTERNAL_TOKEN}`
IN_VIP=`kubectl get configmap matrix -n matrix -o jsOnpath={.data.MATRIX_INTERNAL_VIP}`
MATRIX_SECURE_PORT=`kubectl get cm matrix -n matrix -o jsOnpath={.data.MATRIX_SECURE_PORT}`
MATRIX_SYSTEMCOnFIG=$(curl -s -k -H "X-Auth-Token:${TOKEN}" https://localhost:8443/matrix/rsapi/v1.0/cluster/systemconfig)
VIP_MODE=`echo ${MATRIX_SYSTEMCONFIG} | jq -r ".vipMode"`
if [[ ${VIP_MODE} == "EXTERNAL" ]]; then
    IN_VIP=`kubectl get svc matrix-leader-service -n matrix -o jsOnpath={.spec.clusterIP}`
fi
if [[ $IN_VIP =~ ":" ]]; then
        IN_VIP="\[$IN_VIP\]"
fi
NODES_INFO=`curl -k -H "X-Auth-Token:${TOKEN}" https://${IN_VIP}:${MATRIX_SECURE_PORT}/matrix/rsapi/v1.0/cluster/nodes`
NODES_NUM=`echo ${NODES_INFO}|jq length`
MASTER_NODE_NUMBER=0
for ((i=0;i<${NODES_NUM};i++)); do
    role=`echo ${NODES_INFO} | jq -r .[$i].nodeBaseInfo.role`
    echo "the node role is $role"
    if [ $role == "Master" ]; then
       ((MASTER_NODE_NUMBER+=1))
    fi
done
echo "the number of master is $MASTER_NODE_NUMBER"

#获取matrix节点信息
matrix_token=$(kubectl get configmap -n matrix matrix -o jsOnpath='{.data.MATRIX_INTERNAL_TOKEN}')
matrix_port=$(kubectl get configmap -n matrix matrix -o jsOnpath='{.data.MATRIX_SECURE_PORT}')

ssh_port_result=`curl -s -g --header "Content-Type:application/json" -k  --header "X-Auth-Token:${matrix_token}" --request GET --url https://localhost:${matrix_port}/matrix/rsapi/v1.0/cluster/ssh_port --retry 3 --retry-delay 10 --max-time 5 --connect-timeout 3`
ssh_port=`echo $ssh_port_result | jq ."sshPort"`
if [[ $ssh_port'X' == 'X' ]]; then
  echo "get ssh port error."
  ssh_port=22
fi
#获取master节点ip
master_node_iparr=($(kubectl get nodes -owide  --selector=node-role.kubernetes.io/master --no-headers=true |awk '{print $6}'))
#获取节点权限
# shellcheck disable=SC2006
nodes_account_info=`curl -s --retry 3 --retry-delay 10 --max-time 5 --connect-timeout 3 --header "Content-Type:application/json" -k  --header "X-Auth-Token:${matrix_token}" \
        --request GET --url https://localhost:${matrix_port}/matrix/rsapi/v1.0/cluster/nodes_account_info`
node_account_num=`echo $nodes_account_info | jq '. | length'`
localhost_iparr=($(hostname -I))

check_scripts_path=/opt/matrix/app/install/metadata/gluster/gluster/heketi/scripts
install_pack_path=/opt/matrix/app/install/packages

function checkParam() {
    #获取已有glusterfs安装信息
    secret=`kubectl get secret -n ${NAMESPACES} heketi-config-secret -o json|jq .data |grep topology.json |sed "s#\"topology.json\": ##g" |sed 's#\"##g' |tr -s [:space:] |sed 's/^[ \t]*//g'`
    gfs_json=`echo $secret  |base64 -d`
    gfs_pack_name=$1

    #遍历gfs_json
    gfs_json_len=`echo $gfs_json |jq .clusters[0].nodes |jq length`
    for ((i=0;i<${gfs_json_len};i++)); do
        gfs_node_info=$(echo $gfs_json |jq .clusters[0].nodes[$i])
        node_name=$(echo $gfs_node_info | jq -r  .node.hostnames.manage[0])
        #
        devs_len=$(echo $gfs_node_info |jq .devices |jq length)
        for ((j=0;j<${devs_len};j++)); do
            dev_name=$(echo $gfs_node_info |jq -r .devices[$j])
            isExistDevice $node_name $dev_name
            if [[ $? -ne 0 ]];then
                #盘符发生变化,注释脚本
                echo "gfs 发生盘符变化"
                echo "Taking evasive measures ..."
                #备份安装包
                if [[ -d ${install_pack_path}/gfs_bak ]];then
                    echo "备份文件已存在"
                else
                    mkdir -p ${install_pack_path}/gfs_bak
                    \cp ${install_pack_path}/${gfs_pack_name} ${install_pack_path}/gfs_bak/
                fi
                #解压安装包
                unzip -q ${install_pack_path}/${gfs_pack_name} -d ${install_pack_path}/
                arch_type=$(echo ${gfs_pack_name} |grep x86 |wc -l)
                if [[ ${arch_type} -ne 0 ]];then
                    dir_name=${gfs_pack_name%_x86*.*}
                else
                    dir_name=${gfs_pack_name%_arm*.*}
                fi
                #替换文件内容
                sed -i '/isExistDevice /s/^/#/' ${install_pack_path}/${dir_name}/metadata/gluster/heketi/scripts/check.sh
                sed -i '/checkDiskUsed /s/^/#/' ${install_pack_path}/${dir_name}/metadata/gluster/heketi/scripts/check.sh
                #
                sed -i '/#.*isExistDevice/a\             sleep 2' ${install_pack_path}/${dir_name}/metadata/gluster/heketi/scripts/check.sh
                #重新压缩安装包
                rm -rf ${install_pack_path}/${gfs_pack_name}
                cd  ${install_pack_path}/
                zip -qr ${install_pack_path}/${gfs_pack_name} ${dir_name}
                #删除解压文件
                rm -rf ${install_pack_path}/${dir_name}
                #拷贝到其他节点
                for i in $(seq 0 $((node_account_num - 1))); do
                    node_ip=$(echo $nodes_account_info | jq -r ".[$i].ipList[0]")
                    if [[ ${localhost_iparr[@]} =~ ${node_ip} ]];then
                        continue
                    fi
                    node_user=$(echo $nodes_account_info | jq -r ".[$i].username")
                    node_passwd=$(echo $nodes_account_info | jq -r ".[$i].password")
                    is_already_bask=$(sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} "sudo bash -c '[ -d ${install_pack_path}/gfs_bak ] && echo 1 || echo 0 '")
                    if [[ ${is_already_bask} -ne 0  ]];then
                        sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
                              "sudo bash -c 'mkdir -p ${install_pack_path}/gfs_bak; \cp ${install_pack_path}/${gfs_pack_name} ${install_pack_path}/gfs_bak/'"
                    fi
                    sshpass -p ''${node_passwd}'' scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -P ${ssh_port} ${install_pack_path}/${gfs_pack_name}  ${node_user}@${node_ip}:${install_pack_path}/
                done
                return 0
            fi
        done
    done
    echo "gfs盘符未发生变化!无需操作"
}
function isExistDevice() {
    num=`echo ${NODES_INFO}|jq length`
    dev=`echo $2|sed 's#\/dev\/##g'`
    for ((k=0;k<${num};k++)); do
        hostName=`echo $NODES_INFO| jq .[$k].nodeBaseInfo.nodeName |sed 's/\"//g'`
        if [ "$hostName" == "$1" ]; then
            NODEID=`echo ${NODES_INFO} | jq -r .[$k].nodeId`
            exitCode=`curl -X POST -k -H "X-Auth-Token:${TOKEN}" -H "Content-Type:application/json" -d "{\"nodeId\":\"${NODEID}\",\"command\":\"ls /dev/$dev \"}" https://${IN_VIP}:${MATRIX_SECURE_PORT}/matrix/rsapi/v1.0/exec_cmd |jq .exitCode`
            if [[ $exitCode -ne 0 ]]; then
                echo "device is not exit, nodename:$1, device:$2"
                return 1
            fi
            exitCode=`curl -X POST -k -H "X-Auth-Token:${TOKEN}" -H "Content-Type:application/json" -d "{\"nodeId\":\"${NODEID}\",\"command\":\"df -h |grep /dev/$dev \"}" https://${IN_VIP}:${MATRIX_SECURE_PORT}/matrix/rsapi/v1.0/exec_cmd |jq .exitCode`
            if [[ $exitCode -eq 0 ]]; then
                echo "device is mounted, nodename:$1, device:$2"
                return 1
            fi
            exitCode=`curl -X POST -k -H "X-Auth-Token:${TOKEN}" -H "Content-Type:application/json" -d "{\"nodeId\":\"${NODEID}\",\"command\":\"pvdisplay |grep /dev/$dev \"}" https://${IN_VIP}:${MATRIX_SECURE_PORT}/matrix/rsapi/v1.0/exec_cmd |jq .exitCode`
            if [[ $exitCode -ne 0 ]]; then
                echo "device type is not lvm, nodename:$1, device:$2"
                return 1
            fi
            break
        fi
    done
}

function check_rcovery() {
    gfs_pack_name=$1
    #sed -i '/^# *isExistDevice /s/^# //' /opt/matrix/app/install/metadata/gluster/gluster/heketi/scripts/check_bak.sh
    #sed -i '/^# *checkDiskUsed /s/^# //' /opt/matrix/app/install/metadata/gluster/gluster/heketi/scripts/check_bak.sh
    echo "Recover environment ..."
    for i in $(seq 0 $((node_account_num - 1))); do
        node_ip=$(echo $nodes_account_info | jq -r ".[$i].ipList[0]")
        node_user=$(echo $nodes_account_info | jq -r ".[$i].username")
        node_passwd=$(echo $nodes_account_info | jq -r ".[$i].password")
        #判断是否发生了盘符变化
        is_change=$(sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
            "sudo bash -c ' ls -l ${install_pack_path} |grep gfs_bak |wc -l '")
        if [[ ${is_change} -ne 0 ]];then
            #修改各节点安装包
            sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
               "sudo bash -c '\cp ${install_pack_path}/gfs_bak/${gfs_pack_name}  ${install_pack_path}/'"
            #修改metadata
            sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
               "sudo bash -c \"sed -i '/^#\+ *isExistDevice /s/^#\+//'  ${check_scripts_path}/check.sh\""
            sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
               "sudo bash -c \"sed -i '/^#\+ *checkDiskUsed /s/^#\+//'  ${check_scripts_path}/check.sh\""
            sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
               "sudo bash -c \"sed -i '/sleep 2/d'  ${check_scripts_path}/check.sh\""
            #删除备份文件
            sshpass -p ''${node_passwd}'' ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${ssh_port} ${node_user}@${node_ip} \
               "sudo bash -c 'rm -rf ${install_pack_path}/gfs_bak '"
        fi
    done
    echo "脚本执行成功"
}

main() {

    specPath=$3
    if [[ -n ${specPath}  ]];then
        check_scripts_path=${specPath}
    fi
    gfs_pack=$2
    if [[ ${gfs_pack}"X" == "X" ]];then
        echo "传参错误,请传入脚本运行参数: \$1 start 或 end, \$2 升级安装包名"
        exit 1
    fi

    if [[  $1 == "start" ]];then
        checkParam $gfs_pack
        if [[ $? -eq 0 ]];then
            echo "脚本执行成功!"
        fi
    elif [[ $1 == "end"  ]];then
        check_rcovery $gfs_pack
    else
        echo "传参错误,请传入脚本运行参数: \$1 start 或 end, \$2 升级安装包名"
        exit 1
    fi
}

main $@




可直接连接技术人员直接获取;

该案例对您是否有帮助:

您的评价:1

若您有关于案例的建议,请反馈:

0 个评论

该案例暂时没有网友评论

编辑评论

举报

×

侵犯我的权益 >
对根叔知了社区有害的内容 >
辱骂、歧视、挑衅等(不友善)

侵犯我的权益

×

泄露了我的隐私 >
侵犯了我企业的权益 >
抄袭了我的内容 >
诽谤我 >
辱骂、歧视、挑衅等(不友善)
骚扰我

泄露了我的隐私

×

您好,当您发现根叔知了上有泄漏您隐私的内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到pub.zhiliao@h3c.com 邮箱,我们会尽快处理。
  • 1. 您认为哪些内容泄露了您的隐私?(请在邮件中列出您举报的内容、链接地址,并给出简短的说明)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)

侵犯了我企业的权益

×

您好,当您发现根叔知了上有关于您企业的造谣与诽谤、商业侵权等内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到 pub.zhiliao@h3c.com 邮箱,我们会在审核后尽快给您答复。
  • 1. 您举报的内容是什么?(请在邮件中列出您举报的内容和链接地址)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)
  • 3. 是哪家企业?(营业执照,单位登记证明等证件)
  • 4. 您与该企业的关系是?(您是企业法人或被授权人,需提供企业委托授权书)
我们认为知名企业应该坦然接受公众讨论,对于答案中不准确的部分,我们欢迎您以正式或非正式身份在根叔知了上进行澄清。

抄袭了我的内容

×

原文链接或出处

诽谤我

×

您好,当您发现根叔知了上有诽谤您的内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到pub.zhiliao@h3c.com 邮箱,我们会尽快处理。
  • 1. 您举报的内容以及侵犯了您什么权益?(请在邮件中列出您举报的内容、链接地址,并给出简短的说明)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)
我们认为知名企业应该坦然接受公众讨论,对于答案中不准确的部分,我们欢迎您以正式或非正式身份在根叔知了上进行澄清。

对根叔知了社区有害的内容

×

垃圾广告信息
色情、暴力、血腥等违反法律法规的内容
政治敏感
不规范转载 >
辱骂、歧视、挑衅等(不友善)
骚扰我
诱导投票

不规范转载

×

举报说明

提出建议

    +

亲~登录后才可以操作哦!

确定

亲~检测到您登陆的账号未在http://hclhub.h3c.com进行注册

注册后可访问此模块

跳转hclhub

你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作