diff --git a/00base/07env-install-centos.sh b/00base/07env-install-centos.sh index df7aec0..743695c 100644 --- a/00base/07env-install-centos.sh +++ b/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环境