lizw 2 роки тому
батько
коміт
516db1359c
1 змінених файлів з 147 додано та 1 видалено
  1. 147 1
      00base/07env-install-centos.sh

+ 147 - 1
00base/07env-install-centos.sh

@@ -29,6 +29,15 @@ JDK_DIR_NAME="jdk-11.0.16.1"
 
 
 # 安装标识
+#--- 执行用户
+SUDO_TAG="0"
+SUDO_USER=""
+SUDO_PASSWORD=""
+SSH_OPTIONS="-o ConnectTimeout=600 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
+SSH_USER=""
+SSH_PASSWORD=""
+$SSH_PRIVATE_KEY=""
+SSH_PORT=""
 #--- 指令
 INIT_TAG="0"
 #--- 指令参数
@@ -48,6 +57,7 @@ LOG_FILE="${TMP_DIR}/env-install.log"
 ERROR_INFO="\n\033[31mERROR Summary: \033[0m\n  "
 ACCESS_INFO="\n\033[32mACCESS Summary: \033[0m\n  "
 SCRIPT_PARAMETER="$*"
+COMMAND_OUTPUT=""
 
 ######################################################################################################
 # 通用函数
@@ -89,12 +99,148 @@ function log::exec() {
   printf "[%s]: \033[34mEXEC:    \033[0m%s\n" "$(date +'%Y-%m-%dT%H:%M:%S.%N%z')" "$*" >> "$LOG_FILE"
 }
 
+# 检查返回码
+function check::exit_code() {
+  local code=${1:-}
+  local app=${2:-}
+  local desc=${3:-}
+  local exit_script=${4:-}
+  if [[ "${code}" == "0" ]]; then
+    log::info "[${app}]" "${desc} succeeded."
+  else
+    log::error "[${app}]" "${desc} failed."
+    [[ "$exit_script" == "exit" ]] && exit "$code"
+  fi
+}
+
+# 重试
+function utils::retry() {
+  local retries=$1
+  shift
+  local count=0
+  until eval "$*"; do
+    exit=$?
+    wait=$((2 ** count))
+    count=$((count + 1))
+    if [ "$count" -lt "$retries" ]; then
+      echo "Retry $count/$retries exited $exit, retrying in $wait seconds..."
+      sleep $wait
+    else
+      echo "Retry $count/$retries exited $exit, no more retries left."
+      return $exit
+    fi
+  done
+  return 0
+}
+
+# 转义引号
+function utils::quote() {
+  # shellcheck disable=SC2046
+  if [ $(echo "$*" | tr -d "\n" | wc -c) -eq 0 ]; then
+    echo "''"
+  elif [ $(echo "$*" | tr -d "[a-z][A-Z][0-9]:,.=~_/\n-" | wc -c) -gt 0 ]; then
+    printf "%s" "$*" | sed -e "1h;2,\$H;\$!d;g" -e "s/'/\'\"\'\"\'/g" | sed -e "1h;2,\$H;\$!d;g" -e "s/^/'/g" -e "s/$/'/g"
+  else
+    echo "$*"
+  fi
+}
+
+# 下载文件
+function utils::download_file() {
+  local url="$1"
+  local dest="$2"
+  local unzip_tag="${3:-1}"
+  local dest_dirname; dest_dirname=$(dirname "$dest")
+  local filename; filename=$(basename "$dest")
+  log::info "[download]" "${filename}"
+  command::exec "${MGMT_NODE}" "
+    set -e
+    if [ ! -f \"${dest}\" ]; then
+      [ ! -d \"${dest_dirname}\" ] && mkdir -pv \"${dest_dirname}\"
+      wget --timeout=10 --waitretry=3 --tries=5 --retry-connrefused --no-check-certificate \"${url}\" -O \"${dest}\"
+      if [[ \"${unzip_tag}\" == \"unzip\" ]]; then
+        command -v unzip 2>/dev/null || yum install -y unzip
+        unzip -o \"${dest}\" -d \"${dest_dirname}\"
+      fi
+    else
+      echo \"${dest} is exists!\"
+    fi
+  "
+  local status="$?"
+  check::exit_code "$status" "download" "${filename}" "exit"
+  return "$status"
+}
+
+# 检查命令是否存在
+function check::command_exists() {
+  local cmd=${1}
+  local package=${2}
+  if command -V "$cmd" > /dev/null 2>&1; then
+    log::info "[check]" "$cmd command exists."
+  else
+    log::warning "[check]" "I require $cmd but it's not installed."
+    log::warning "[check]" "install $package package."
+    command::exec "127.0.0.1" "yum install -y ${package}"
+    check::exit_code "$?" "check" "$package install" "exit"
+  fi
+}
+
+# 执行命令
+function command::exec() {
+  local host=${1:-"127.0.0.1"}
+  shift
+  local command="$*"
+  if [[ "${SUDO_TAG:-}" == "1" ]]; then
+    sudo_options="sudo -H -n -u ${SUDO_USER}"
+    if [[ "${SUDO_PASSWORD:-}" != "" ]]; then
+       sudo_options="${sudo_options// -n/} -p \"\" -S <<< \"${SUDO_PASSWORD}\""
+    fi
+    command="$sudo_options bash -c $(utils::quote "$command")"
+  fi
+  command="$(utils::quote "$command")"
+  if [[ "${host}" == "127.0.0.1" ]]; then
+    # 本地执行
+    log::exec "[command]" "bash -c $(printf "%s" "${command//${SUDO_PASSWORD:-}/zzzzzz}")"
+    # shellcheck disable=SC2094
+    COMMAND_OUTPUT=$(eval bash -c "${command}" 2>> "$LOG_FILE" | tee -a "$LOG_FILE")
+    local status=$?
+  else
+    # 远程执行
+    local ssh_cmd="ssh"
+    if [[ "${SSH_PASSWORD}" != "" ]]; then
+      ssh_cmd="sshpass -p \"${SSH_PASSWORD}\" ${ssh_cmd}"
+    elif [[ "$SSH_PRIVATE_KEY" != "" ]]; then
+      [ -f "${SSH_PRIVATE_KEY}" ] || { log::error "[exec]" "ssh private_key:${SSH_PRIVATE_KEY} not found."; exit 1; }
+      ssh_cmd="${ssh_cmd} -i $SSH_PRIVATE_KEY"
+    fi
+    log::exec "[command]" "${ssh_cmd//${SSH_PASSWORD:-}/zzzzzz} ${SSH_OPTIONS} ${SSH_USER}@${host} -p ${SSH_PORT} bash -c $(printf "%s" "${command//${SUDO_PASSWORD:-}/zzzzzz}")"
+    # shellcheck disable=SC2094
+    COMMAND_OUTPUT=$(eval "${ssh_cmd} ${SSH_OPTIONS} ${SSH_USER}@${host} -p ${SSH_PORT}" bash -c '"${command}"' 2>> "$LOG_FILE" | tee -a "$LOG_FILE")
+    local status=$?
+  fi
+  return $status
+}
+
 ######################################################################################################
 # 安装函数
 ######################################################################################################
 # 新增用户
 function init:add_user() {
-  log::info "[add-user]" "新增用户"
+  log::info "[add-user]" "新增用户[${ADD_USER_NAME}]..."
+  local host="127.0.0.1"
+  command::exec "${host}" "
+    # 创建用户
+    adduser ${ADD_USER_NAME}
+    # 设置密码
+    echo ${ADD_USER_NAME}:${ADD_USER_PASSWORD} | chpasswd
+    # 新增修改权限
+    chmod -v u+w /etc/sudoers
+    echo '\n${ADD_USER_NAME}    ALL=(ALL)       NOPASSWD:ALL\n' >> /etc/sudoers.d/crictl
+    # 收回修改权限
+    chmod -v u-w /etc/sudoers
+  "
+  check::exit_code "$?" "add-user" "$host 新增用户[${ADD_USER_NAME}]" "exit"
+  log::info "[add-user]" "新增用户[${ADD_USER_NAME}]成功!"
 }
 
 # 安装git环境