shell运维脚本优化

 

我们在平常工作中,你是否感觉shell脚本只是命令的堆砌;很多时候只是为了实现功能而没有好的组织结构;自己的脚本都不想再看一遍;此让你的shell脚本有python一样的美感并且极易维护,真的是shell脚本写到停不下来。

现以k8s发版脚本为例,看一下脚本的优化过程:

脚本执行需要传参数: 

root@portal:/home/centos/build# ./release.sh test all-link-platform_all-link-process
#!/bin/bash

set -eu

ns=$1
project_name=$(echo $2|awk -F '_' '{print $2}')
modul_name=$(echo $2|awk -F '_' '{print $3}')
image_tag=harbor.example.cn:32443/jenkins-$ns/$project_name/$modul_name:$ns_$(date +%y%m%d%H%M)_manual_$project_name_$modul_name

# 1. 构建镜像
docker build -t  $image_tag -f jarFile .

# 2. 检查镜像
result=$(docker images|grep $tag)
if [[ $result == '' ]]; then
   echo "镜像不存在,请检查!"
   exit 1 
fi

# 3. 上传镜像然后删除本地镜像
docker push $image_tag && docker rmi $image_tag

# 4. 更新deployment镜像
kubectl patch deployment $ns-$project_name-$modul_name -n $ns --patch "{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"$ns-$project_name-$modul_name\",\"image\":\"$image_tag\"}]}}}}"

其实我这个脚本因为功能不是很多,所以看起来还算清晰。但要是那种上百行从上到下的shell脚本,那要理清楚逻辑就是很痛苦的事情了。

下面是优化后的脚本

#!/bin/bash

set -eu

baseName=`basename $0`

current=$(date +%y%m%d%H%M)
project_name=$(echo $2|awk -F '_' '{print $1}')
modul_name=$(echo $2|awk -F '_' '{print $2}')
image_tag=harbor.example.cn:32443/jenkins-$ns/$project_name/$modul_name:"$ns"_"$current"_"$project_name"_"$modul_name"

function print_log() {
    log_level=$1
    log_msg=$2
    currentTime=`echo $(date +%F%n%T)`
    echo "$currentTime [$log_level] $log_msg"
}


function print_usage() {
    print_log "INFO" "Usage: $baseName namespace projectName_moduleName"
    print_log "INFO" "Example:"
    print_log "INFO" " $baseName test industry-platform_auth"
}


function build_image() {
    docker build -t $image_tag -f jarFile .
}

function check_image() {
    result=docker images | grep $current
    if [[$result == '']]; then
      print_log "ERROR" "Image not found,please check!"
      exit 1
    fi
}

function pr_image() {
    docker push $image_tag && docker rmi $image_tag
}

function update_deploy() {
  kubectl patch deployment $ns-$project_name-$modul_name -n $ns --patch "{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"$ns-$project_name-$modul_name\",\"image\":\"$image_tag\"}]}}}}"
}

function main() {
    if [ $# -ne 2 ]; then
    print_log "ERROR" "Exactly three parameter is required."
    print_usage
    return 1
    fi
    build_image
    check_image
    pr_image
    update_deploy
}


########################
### 主程序逻辑 ###
########################
main "$@

 

优化过后代码好像还变复杂了,手动狗头。。。  其实仔细看的话结构还是很清晰的,上面也讲了是因为功能比较简单,就体现不出优势了。

上面脚本中有个日志打印的函数,是我从腾讯一位大佬的脚本中学到的,我觉得这个很棒,所以硬加进去了,哈哈哈。

 

参考连接: https://www.jianshu.com/p/121afeea78fc

posted @ 2023-11-20 10:57  高佳丰  阅读(77)  评论(0编辑  收藏  举报