diff --git a/ezctl b/ezctl index 6393b86..1b15eb5 100755 --- a/ezctl +++ b/ezctl @@ -1,5 +1,6 @@ #!/bin/bash # Create & manage k8s clusters +# shellcheck disable=SC2155 set -o nounset set -o errexit @@ -39,23 +40,24 @@ EOF } function logger() { - TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S') - case "$1" in - debug) - echo -e "$TIMESTAMP \033[36mDEBUG\033[0m $2" - ;; - info) - echo -e "$TIMESTAMP \033[32mINFO\033[0m $2" - ;; - warn) - echo -e "$TIMESTAMP \033[33mWARN\033[0m $2" - ;; - error) - echo -e "$TIMESTAMP \033[31mERROR\033[0m $2" - ;; - *) - ;; - esac + TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S') + local FNAME=$(basename "${BASH_SOURCE[1]}") + local SOURCE="\033[36m[$FNAME:${BASH_LINENO[0]}]\033[0m" + case "$1" in + debug) + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[36mDEBUG $2\033[0m" + ;; + info) + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[32mINFO $2\033[0m" + ;; + warn) + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[33mWARN $2\033[0m" + ;; + error) + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[31mERROR $2\033[0m" + ;; + *) ;; + esac } function help-info() { @@ -99,7 +101,7 @@ function usage-kcfg-adm(){ echo -e "\033[33mUsage:\033[0m ezctl kcfg-adm " cat <: - -A to add a client kubeconfig with a newly created user + -A to add a client kubeconfig with a newly created user -D to delete a client kubeconfig with the existed user -L to list all of the users -e to set expiry of the user certs in hours (ex. 24h, 8h, 240h) @@ -116,7 +118,7 @@ function usage-setup(){ echo -e "\033[33mUsage:\033[0m ezctl setup " cat < /dev/null 2>&1 || { logger debug "disable registry mirrors"; registryMirror=false; } sed -i -e "s/__k8s_ver__/$k8sVer/g" \ - -e "s/__flannel__/$flannelVer/g" \ + -e "s/__flannel__/$flannelVer/g" \ -e "s/__calico__/$calicoVer/g" \ -e "s/__cilium__/$ciliumVer/g" \ -e "s/__kube_ovn__/$kubeOvnVer/g" \ @@ -234,7 +236,7 @@ function setup() { ;; (*) usage-setup - exit 1 + exit 1 ;; esac @@ -364,7 +366,7 @@ function add-master() { ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/23.addmaster.yml" -e "NODE_TO_ADD=$2" -e "@clusters/$1/config.yml" logger info "reconfigure and restart 'kube-lb' service" - ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/90.setup.yml" -t restart_kube-lb -e "@clusters/$1/config.yml" + ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/90.setup.yml" -t restart_kube-lb -e "@clusters/$1/config.yml" logger info "reconfigure and restart 'ex-lb' service" ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/10.ex-lb.yml" -t restart_lb -e "@clusters/$1/config.yml" @@ -386,9 +388,9 @@ function add-etcd() { logger info "reconfig &restart the etcd cluster" ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/02.etcd.yml" -t restart_etcd -e "@clusters/$1/config.yml" - + logger info "restart apiservers to use the new etcd cluster" - ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/04.kube-master.yml" -t restart_master -e "@clusters/$1/config.yml" + ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/04.kube-master.yml" -t restart_master -e "@clusters/$1/config.yml" } function del-etcd() { @@ -403,9 +405,9 @@ function del-etcd() { logger info "reconfig &restart the etcd cluster" ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/02.etcd.yml" -t restart_etcd -e "@clusters/$1/config.yml" - + logger info "restart apiservers to use the new etcd cluster" - ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/04.kube-master.yml" -t restart_master -e "@clusters/$1/config.yml" + ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/04.kube-master.yml" -t restart_master -e "@clusters/$1/config.yml" } function del-node() { @@ -427,13 +429,13 @@ function del-master() { sed -n '/^\[kube_master/,/^\[kube_node/p' "$BASE/clusters/$1/hosts"|grep -E "^$2$|^$2 " || { logger error "master $2 not existed!"; return 2; } logger warn "start to delete the master:$2 from cluster:$1" - ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/33.delmaster.yml" -e "NODE_TO_DEL=$2" -e "CLUSTER=$1" -e "@clusters/$1/config.yml" + ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/33.delmaster.yml" -e "NODE_TO_DEL=$2" -e "CLUSTER=$1" -e "@clusters/$1/config.yml" logger info "reconfig kubeconfig in ansible manage node" ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/roles/deploy/deploy.yml" -t create_kctl_cfg -e "@clusters/$1/config.yml" logger info "reconfigure and restart 'kube-lb' service" - ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/90.setup.yml" -t restart_kube-lb -e "@clusters/$1/config.yml" + ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/90.setup.yml" -t restart_kube-lb -e "@clusters/$1/config.yml" logger info "reconfigure and restart 'ex-lb' service" ansible-playbook -i "$BASE/clusters/$1/hosts" "$BASE/playbooks/10.ex-lb.yml" -t restart_lb -e "@clusters/$1/config.yml" @@ -484,7 +486,7 @@ function renew-ca() { EXPIRY="4800h" # default cert will expire in 200 days -USER_TYPE="admin" # admin/view, admin=clusterrole:cluster-admin view=clusterrole:view +USER_TYPE="admin" # admin/view, admin=clusterrole:cluster-admin view=clusterrole:view USER_NAME="user" function kcfg-adm() { OPTIND=2 @@ -522,7 +524,7 @@ function kcfg-adm() { logger info "$ACTION" ${ACTION} || { logger error "$ACTION fail"; return 1; } - logger info "$ACTION success" + logger info "$ACTION success" } function add-kcfg(){ @@ -545,10 +547,10 @@ function list-kcfg(){ ADMINS=$(bin/kubectl --kubeconfig="clusters/$1/kubectl.kubeconfig" get clusterrolebindings -ojsonpath='{.items[?(@.roleRef.name == "cluster-admin")].subjects[*].name}') VIEWS=$(bin/kubectl --kubeconfig="clusters/$1/kubectl.kubeconfig" get clusterrolebindings -ojsonpath='{.items[?(@.roleRef.name == "view")].subjects[*].name}') ALL=$(bin/kubectl --kubeconfig="clusters/$1/kubectl.kubeconfig" get clusterrolebindings -ojsonpath='{.items[*].subjects[*].name}') - + printf "\n%-30s %-15s %-20s\n" USER TYPE "EXPIRY(+8h if in Asia/Shanghai)" echo "---------------------------------------------------------------------------------" - + for u in $ADMINS; do if [[ $u =~ ^.*-[0-9]{12}$ ]];then t=$(bin/cfssl-certinfo -cert "clusters/$1/ssl/users/$u.pem"|grep not_after|awk '{print $2}'|sed 's/"//g'|sed 's/,//g') @@ -586,9 +588,9 @@ function main() { # check 'ansible' executable which ansible > /dev/null 2>&1 || { logger error "need 'ansible', try: 'pip install ansible'"; usage; exit 1; } - + [ "$#" -gt 0 ] || { usage >&2; exit 2; } - + case "$1" in ### in-cluster operations ##################### (add-etcd) @@ -681,4 +683,4 @@ function main() { esac } -main "$@" +main "$@" diff --git a/ezdown b/ezdown index 91f3c60..9e48058 100755 --- a/ezdown +++ b/ezdown @@ -1,12 +1,13 @@ #!/bin/bash #-------------------------------------------------- -# This script is used for: +# This script is used for: # 1. to download the scripts/binaries/images needed for installing a k8s cluster with kubeasz # 2. to run kubeasz in a container (recommended) # @author: gjmzj # @usage: ./ezdown # @repo: https://github.com/easzlab/kubeasz #-------------------------------------------------- +# shellcheck disable=SC2155 set -o nounset set -o errexit set -o pipefail @@ -111,7 +112,7 @@ available options: local-path-provisioner to download images of local-path-provisioner network-check to download images of network-check nfs-provisioner to download images of nfs-provisioner - prometheus to download images of prometheus + prometheus to download images of prometheus examples: ./ezdown -X prometheus EOF @@ -119,21 +120,22 @@ EOF function logger() { TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S') + local FNAME=$(basename "${BASH_SOURCE[1]}") + local SOURCE="\033[36m[$FNAME:${BASH_LINENO[0]}]\033[0m" case "$1" in debug) - echo -e "$TIMESTAMP \033[36mDEBUG\033[0m $2" + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[36mDEBUG $2\033[0m" ;; info) - echo -e "$TIMESTAMP \033[32mINFO\033[0m $2" + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[32mINFO $2\033[0m" ;; warn) - echo -e "$TIMESTAMP \033[33mWARN\033[0m $2" + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[33mWARN $2\033[0m" ;; error) - echo -e "$TIMESTAMP \033[31mERROR\033[0m $2" - ;; - *) + echo -e "\033[36m$TIMESTAMP\033[0m $SOURCE \033[31mERROR $2\033[0m" ;; + *) ;; esac } @@ -160,13 +162,13 @@ function download_docker() { mkdir -p "$BASE/bin/docker-bin" && \ cp -f "$BASE"/down/docker/* "$BASE/bin/docker-bin" && \ mv -f "$BASE"/down/docker/* /opt/kube/bin && \ - ln -sf /opt/kube/bin/docker /bin/docker + ln -sf /opt/kube/bin/docker /bin/docker } function install_docker() { # check if a container runtime is already installed systemctl status docker|grep Active|grep -q running && { logger warn "docker is already running."; return 0; } - + logger debug "generate docker service file" cat > /etc/systemd/system/docker.service << EOF [Unit] @@ -276,7 +278,7 @@ function get_kubeasz() { function get_k8s_bin() { [[ -f "$BASE/bin/kubelet" ]] && { logger warn "kubernetes binaries existed"; return 0; } - + logger info "downloading kubernetes: $K8S_BIN_VER binaries" rm -rf "$BASE/k8s_bin_tmp" docker ps -a |grep -q temp_k8s_bin && { logger debug "remove existing container"; docker rm -f temp_k8s_bin; } @@ -368,7 +370,7 @@ function get_default_images() { # dns-node-cache if [[ ! -f "$imageDir/k8s-dns-node-cache_$dnsNodeCacheVer.tar" ]];then docker pull "easzlab/k8s-dns-node-cache:$dnsNodeCacheVer" && \ - docker save -o "$imageDir/k8s-dns-node-cache_$dnsNodeCacheVer.tar" "easzlab/k8s-dns-node-cache:$dnsNodeCacheVer" + docker save -o "$imageDir/k8s-dns-node-cache_$dnsNodeCacheVer.tar" "easzlab/k8s-dns-node-cache:$dnsNodeCacheVer" else docker load -i "$imageDir/k8s-dns-node-cache_$dnsNodeCacheVer.tar" fi @@ -693,8 +695,8 @@ function start_kubeasz_docker() { function clean_container() { logger info "clean all running containers" - docker ps -a|awk 'NR>1{print $1}'|xargs docker rm -f -} + docker ps -a|awk 'NR>1{print $1}'|xargs docker rm -f +} ### Main Lines ################################################## @@ -703,15 +705,15 @@ function main() { imageDir="$BASE/down" # check if use bash shell - readlink /proc/$$/exe|grep -q "bash" || { logger error "you should use bash shell, not sh"; exit 1; } + # readlink /proc/$$/exe|grep -q "bash" || { logger error "you should use bash shell, not sh"; exit 1; } # check if use with root - [[ "$EUID" -ne 0 ]] && { logger error "you should run this script as root"; exit 1; } + # [[ "$EUID" -ne 0 ]] && { logger error "you should run this script as root"; exit 1; } # get architecture ARCH=$(uname -m) [[ "$#" -eq 0 ]] && { usage >&2; exit 1; } - + ACTION="" while getopts "CDP:RSX:d:e:k:m:z:" OPTION; do case "$OPTION" in @@ -757,10 +759,10 @@ function main() { ;; esac done - + [[ "$ACTION" == "" ]] && { logger error "illegal option"; usage; exit 1; } - - # excute cmd "$ACTION" + + # excute cmd "$ACTION" logger info "Action begin: $ACTION" ${ACTION} || { logger error "Action failed: $ACTION"; return 1; } logger info "Action successed: $ACTION"