shell 脚本实践

211 阅读2分钟

由于工作中,有时候资源不足,不能安装日志收集工具,需要自己手动打开每个文件查看日志,和经常输入k8s,docker命令(命令太长了)

所以编写了一个脚本,来简化这些操作

#!/bin/bash

namespace="uat-poc-be"
pod_id=""
deployment_id=""
be_deploy_script_dir="/home/qwmp/poc_k8s_deploy/be_deploy/be_deploy_scripts"
fe_deploy_script_dir="/home/qwmp/poc_k8s_deploy/fe_deploy_old/fe_deploy_script"
#WORK_DIR=$(pwd)
SCRIPT_PATH=$(readlink -f  "$0")
WORK_DIR=$(dirname $SCRIPT_PATH)

readonly ARTHAS_ZIP="/root/Downloads/arthas-bin.zip"

function get_namespace(){
	pod_id="$1"
	namespace=`kubectl get pods -A | grep  $pod_id | awk '{print $1}'`
}


function jvm(){
	 jcmd 16 GC.heap_info
	 jcmd 16 VM.command_line
}

function is_running(){
        service_name="$1";
        count=$(kubectl get pods -A |  grep -E "$service_name-\w+-\w+\s+" | grep "Running" | awk '{print $2}' | wc -l)
        if [ $count -gt 0 ];
        then
           echo "$service_name is ok:$count"
        else
           echo  -e "\e[38;5;200m$service_name is not running:$count\e[38;5;255m"
        fi
}

function check(){
        echo "checking....."
        while read -r line; do
                is_running $line
        done < $WORK_DIR/pod_list
}


function get_pod_id(){
	 service_name="$1"
	 pods=($(kubectl get pods -A | grep  $service_name | awk '{print $2}'))
	 select pid in ${pods[*]}
	 do
		echo "selected $pid" 
		break
	 done
	 pod_id=$pid
	 get_namespace $pod_id
	 echo "now pod_id is : $pid"
	 echo "now namespace is : $namespace"
}

function ps_h() {
    RAWIN=$(ps -o pid,user,%mem,command ax | grep -v PID | awk '/[0-9]*/{print $1 ":" $2 ":" $4}')
    for i in $RAWIN
    do
        PID=$(echo $i | cut -d: -f1)
        OWNER=$(echo $i | cut -d: -f2)
        COMMAND=$(echo $i | cut -d: -f3)
        MEMORY=$(pmap $PID | tail -n 1 | awk '/[0-9]K/{print $2}')
        printf "%-10s%-15s%-15s%s\n" "$PID" "$OWNER" "$MEMORY" "$COMMAND"
    done
}

function choose_deployment(){
	 service_name="$1"
	 readarray -t  pods< <(ps -ef)
#	 for(( i=1; i<${#pods}; i++ )); 
#	 do
#		echo ${pods[i]}
#	 done
#	for one in "${pods[@]}"
#	do
#		echo $one 
#	done
	 readarray -t  pods< <(kubectl get deployments -A | grep $service_name)
	 select one_pod in "${pods[@]}"
	 do
		echo "selected $one_pod" 
		break
	 done
         did=$(echo $one_pod | awk '{print $2}')	 
	 nid=$(echo $one_pod | awk '{print $1}')
	 deployment_id=$did
	 namespace=$nid
	 echo "now deployment_id is : $deployment_id"
	 echo "now namespace is : $namespace"
}

function docker_repackage(){
	docker commit -m "update for spring datasource.xml" -a "xiongyuguang"  92e356ef72ee harbor.szzbmy.com/rabbit_backend/rabbit-channel:v2.3.0_20220429
	docker save harbor.szzbmy.com/rabbit_backend/rabbit-channel:v2.3.0_20220429  --output rabbit-channel-v2.3.0_20220429.tar
	dccker exec -it 92e356ef72ee /bin/sh
	docker login --username admin harbor.szzbmy.com    ### pwd    Harbor12345
	docker push harbor.szzbmy.com/rabbit_backend/rabbit-channel:v2.3.0_20220429
}

function get_pod_id_old(){
	service_name="$1"
	echo "$service_name"
	pod_id=`kubectl get pods -A | grep  $service_name | awk '{print $2}'`
	echo "pod_id:$pod_id"
}

function login(){
	service_name="$1"
	echo "login $service_name"
	get_pod_id $service_name
	kubectl exec -it  $pod_id  -n $namespace -- /bin/sh
}

function pod_yaml(){
	service_name="$1"
	echo "pod_yaml $service_name"
	get_pod_id $service_name
	kubectl get pod $pod_id  -n $namespace -o yaml
}

function top_mem_docker(){
	 docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -rk 4 -h
}

function top_mem(){
	ps -ef | sort -rnk 4 | cut -c 1-300 | head -n 20	
}

function status(){
	service_name="$1"
	get_pod_id $service_name
	echo "status : $service_name"
	kubectl get pods $pod_id  -n $namespace -o wide 
}

function info(){
	service_name="$1"
	get_pod_id $service_name
	echo "info : $service_name"
	kubectl describe pods $pod_id -n $namespace 
}

function logs(){
	service_name="$1"
	choose_deployment "$1"
	echo "logs in $deployment_id"
	logdir="/data/download/*be-logs-pvc*/${deployment_id}"
	logdir2="/data/download/*be-logs-pvc*/${deployment_id}-server"
	error_file1="$logdir/info.log"
	error_file2="$logdir/$(date '+%Y-%m-%d')_info.log"
	error_file3="$logdir2/info.log"
	error_file4="$logdir2/$(date '+%Y-%m-%d')_info.log"
	error_file5="$logdir2/info_$(date '+%Y-%m-%d').log"
	error_file6="$logdir2/info_$(date '+%Y-%m-%d').log"
        shift
        tailArgs="$@"
        echo $tailArgs
        [ -f $error_file1 ] && read -p  $error_file1 && tail  $error_file1 -f $tailArgs
        [ -f $error_file2 ] && read -p  $error_file2 && tail  $error_file2 -f $tailArgs
        [ -f $error_file3 ] && read -p  $error_file3 && tail  $error_file3 -f $tailArgs
        [ -f $error_file4 ] && read -p  $error_file4 && tail  $error_file4 -f $tailArgs
        [ -f $error_file5 ] && read -p  $error_file5 && tail  $error_file5 -f $tailArgs
        [ -f $error_file6 ] && read -p  $error_file6 && tail  $error_file6 -f $tailArgs
}


function find_logs(){
	service_name="$1"
	choose_deployment "$1"
	echo "logs in $deployment_id"
	logdir="/data/download/*be-logs-pvc*/${deployment_id}"
	logdir2="/data/download/*be-logs-pvc*/${deployment_id}-server"
	error_file1="$logdir/info.log"
	error_file2="$logdir/$(date '+%Y-%m-%d')_info.log"
	error_file3="$logdir2/info.log"
	error_file4="$logdir2/$(date '+%Y-%m-%d')_info.log"
	error_file5="$logdir2/info_$(date '+%Y-%m-%d').log"
	error_file6="$logdir2/info_$(date '+%Y-%m-%d').log"
        shift
        tailArgs="$@"
        echo $tailArgs
        echo "aaaaaa"
	[ -f $error_file1 ] && echo  $error_file1 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
	[ -f $error_file2 ] && echo  $error_file2 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
	[ -f $error_file3 ] && echo  $error_file3 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
	[ -f $error_file4 ] && echo  $error_file4 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
	[ -f $error_file5 ] && echo  $error_file5 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
	[ -f $error_file6 ] && echo  $error_file6 | xargs -n 1 -I {}  grep  -i $tailArgs "{}" 
}

function error_logs(){
	service_name="$1"
	choose_deployment "$1"
	echo "logs in $deployment_id"
	logdir="/data/download/*be-logs-pvc*/${deployment_id}"
	logdir2="/data/download/*be-logs-pvc*/${deployment_id}-server"
	error_file1="$logdir/error.log"
	error_file2="$logdir/$(date '+%Y-%m-%d')_error.log"
	error_file3="$logdir2/error.log"
	error_file4="$logdir2/$(date '+%Y-%m-%d')_error.log"
	error_file5="$logdir2/info_$(date '+%Y-%m-%d').log"
	error_file6="$logdir2/info_$(date '+%Y-%m-%d').log"
        shift
        tailArgs="$@"
        echo $tailArgs
        [ -f $error_file1 ] && read -p  $error_file1 && tail  $error_file1 -f $tailArgs
        [ -f $error_file2 ] && read -p  $error_file2 && tail  $error_file2 -f $tailArgs
        [ -f $error_file3 ] && read -p  $error_file3 && tail  $error_file3 -f $tailArgs
        [ -f $error_file4 ] && read -p  $error_file4 && tail  $error_file4 -f $tailArgs
        [ -f $error_file5 ] && read -p  $error_file5 && tail  $error_file5 -f $tailArgs
        [ -f $error_file6 ] && read -p  $error_file6 && tail  $error_file6 -f $tailArgs
}

function cd_logs(){
	sservice_name="$1"
	choose_deployment "$1"
	echo "logs in $deployment_id"
	logdir="/data/download/*be-logs-pvc*/${deployment_id}"
	logdir2="/data/download/*be-logs-pvc*/${deployment_id}-server"
	logdir1_link="$(readlink -f $logdir)"
	logdir2_link="$(readlink -f $logdir2)"
	[ -d $logdir1_link ] && echo "${logdir1_link}" && cd  ${logdir1_link}
	[ -d $logdir2_link ] && echo "${logdir2_link}" && cd ${logdir2_link}
}


function stop(){
      service_name="$1"
      choose_deployment $service_name
      command="kubectl scale deployment $deployment_id --replicas=0 -n $namespace"
      echo $command
      $command
}

function all_logs(){
      service_name="$1"
      choose_deployment $service_name
      command="kubectl scale deployment $deployment_id --replicas=0 -n $namespace"
      echo $command
      $command
}

function start(){
      service_name="$1"
      choose_deployment $service_name
      command="kubectl scale deployment $deployment_id --replicas=1 -n $namespace"
      echo $command
      $command
}

function restart(){
      service_name="$1"
      choose_deployment $service_name
      command="kubectl  rollout restart deployments $deployment_id -n $namespace"
      echo $command
      $command
}

function restart_one(){
      deployment_id="$1"
      command="kubectl  rollout restart deployments $deployment_id -n $namespace"
      echo $command
      #@$command
}

function restart_all(){
        echo "checking....."
        while read -r line; do
                restart_one $line
        done < $WORK_DIR/pod_list
}

function install(){
	 service_name="$1"
	 version="$2"
	 echo "aaa $3"
	 
	 if [ "$3" == 'be' ];
	 then
	 	command="sh $be_deploy_script_dir/deploy.sh $service_name $version"
		echo $command
		$command
	 else
	 	command="sh $fe_deploy_script_dir/deploy.sh $service_name $version"
		echo $command
		$command
	 fi
}

function install_be(){
	 service_name="$1"
	 version="$2"
	 install "$1" "$2" "be"
}

function install_fe(){
	 service_name="$1"
	 version="$2"
	 install "$1" "$2" 'fe'
}

function uninstall(){
	 service_name="$1"
         choose_deployment $service_name
	 helm uninstall $deployment_id -n $namespace
}

function upload(){
	 service_name="$1"
	 source_file_name=$(readlink  -f $2)
	 dest_dir="/data/download"
	 dest_file_name="${dest_dir}/$(basename ${source_file_name})"
	 get_pod_id $service_name
	 kubectl exec -n $namespace $pod_id -- /bin/sh  -c "mkdir -p $dest_dir"
	 kubectl cp $source_file_name $namespace/$pod_id:$dest_dir
	 echo "$source_file_name uploaded to $dest_file_name"
	 return 0
}

function download(){
	 service_name="$1"
	 source_file_name="$2"
	 dest_dir=$(readlink -f $3)/$(basename $source_file_name)
         echo $dest_dir
	 get_pod_id $service_name
	 kubectl cp $namespace/$pod_id:$source_file_name $dest_dir
	 echo "$source_file_name downloaded in $dest_dir"
	 return 0
}

function debug(){
	 service_name="$1"
	 source_file_name="${ARTHAS_ZIP}"
	 get_pod_id $service_name
	 if [ -z $pod_id ];
	 then 
	    echo "you have not select one pod!"
	    exit  
	 else
            echo "you're debuging pod_id:$pod_id"
         fi 
	 kubectl exec -it  $pod_id  -n $namespace -- [ -f /data/download/arthas-bin/arthas-boot.jar ]
	 if [ $? == 1 ]
	 then
            upload $service_name $source_file_name
	 else
	    echo "arthas exits in /data/download/arthas-bin/arthas-boot.jar"
	 fi
	 kubectl exec -it  $pod_id  -n $namespace -- java  -Xms64m -Xmx128m -jar  /data/download/arthas-bin/arthas-boot.jar
}


function help(){
      cat << EOF
ms install rabbit-web v2.3.0 be
ms install_be rabbit-web v2.3.0
ms install_fe rabbit-web v2.3.0 
ms uninstall rabbit-web
ms login rabbit-web
ms stop rabbit-web
ms status rabbit-web
ms logs rabbit-web -n -f 
ms error_logs rabbit-web
ms cd_logs rabbit-web
ms debug rabbit-web
ms start rabbit-web
ms restart rabbit-web
ms restart_all
ms info rabbit-web
ms download rabbit-web /data/server/rabbit-web/conf  ./
ms upload rabbit-web ./conf
ms pod_yaml rabbit_web
ms check
EOF
}

case $1  in 
     top_mem)
       top_mem
     ;;
     top_mem_docker)
       top_mem_docker
     ;;
     login)
        login "$2"
     ;;
	 pod_yaml)
        pod_yaml "$2"
     ;;
     logs)
	shift
        logs "$@"
     ;;
     error_logs)
	shift
        error_logs "$@"
     ;;
     cd_logs)
        cd_logs "$2"
     ;;
     stop)
        stop "$2"
     ;;
     status)
        status "$2"
     ;;
     start)
        start "$2"
     ;;
     install)
        install "$2" "$3" "$4"
     ;;
	 install_be)
        install_be "$2" "$3"
     ;;
	 install_fe)
        install_fe "$2" "$3"
     ;;
     uninstall)
        uninstall "$2"
     ;;
     upload)
        upload "$2" "$3"
     ;;
     debug)
        debug "$2"
     ;;
     info)
        info "$2"
     ;;
     --help)
	help
     ;;
     restart)
        restart "$2"
     ;;
     restart_all)
	restart_all        
     ;;
     grep)
	shift
        find_logs "$@"
     ;;
     choose)
        choose "$2"
     ;;
     check)
        check
     ;;
     tst)
        ps_h | sort -bnr -k3
     ;;
     download)
        download "$2" "$3" "$4"      
esac
exit 0

4"      
esac
exit 0