From 89b0f1e68e653833d8d8e336c29ed57bf2dab6c0 Mon Sep 17 00:00:00 2001 From: seaHi Date: Wed, 30 Sep 2026 15:23:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=20OpenStack=20Ke?= =?UTF-8?q?ystone=20=E6=9C=8D=E5=8A=A1=E9=83=A8=E7=BD=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E7=9A=84=E8=BE=93=E5=87=BA=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.2.sh | 86 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/3.2.sh b/3.2.sh index 29dc62e..569b906 100755 --- a/3.2.sh +++ b/3.2.sh @@ -2,32 +2,69 @@ # OpenStack 控制节点(Rocky) KeyStone 服务部署检查脚本 # 适用于: 3.2 KeyStone服务部署 -# 颜色定义 +# 学生可见输出:每组一行,失败时列出原因;仅统计实际检查结果。 RED='\033[0;31m' GREEN='\033[0;32m' -YELLOW='\033[0;33m' CYAN='\033[0;36m' -NC='\033[0m' # 恢复默认颜色 - +NC='\033[0m' PASS_CNT=0 FAIL_CNT=0 +SECTION_TITLE='' +SECTION_PASS=0 +SECTION_FAIL=0 +SECTION_DETAILS=() -pass() { echo -e "${GREEN}[✔ 通过] $1${NC}"; ((PASS_CNT++)); } -fail() { echo -e "${RED}[✘ 失败] $1${NC}"; ((FAIL_CNT++)); } -info() { echo -e "${CYAN}[➜] $1${NC}"; } +pass() { PASS_CNT=$((PASS_CNT+1)); } +fail() { + FAIL_CNT=$((FAIL_CNT+1)) + if [ -n "$SECTION_TITLE" ]; then + SECTION_DETAILS+=("$1") + else + printf '%b[✘ 失败] %s%b\n' "$RED" "$1" "$NC" + fi +} +section_summary() { + [ -n "$SECTION_TITLE" ] || return 0 + local passed=$((PASS_CNT-SECTION_PASS)) failed=$((FAIL_CNT-SECTION_FAIL)) message + # 没有实际检查结果的分组不显示,也不记为通过。 + if [ "$failed" -gt 0 ]; then + printf '%b[✘ 失败] %s:通过 %s,失败 %s%b\n' "$RED" "$SECTION_TITLE" "$passed" "$failed" "$NC" + for message in "${SECTION_DETAILS[@]}"; do + printf '%b · %s%b\n' "$RED" "$message" "$NC" + done + elif [ "$passed" -gt 0 ]; then + printf '%b[✔ 通过] %s(%s 项)%b\n' "$GREEN" "$SECTION_TITLE" "$passed" "$NC" + fi +} +info() { + section_summary + SECTION_TITLE=$1 + SECTION_PASS=$PASS_CNT + SECTION_FAIL=$FAIL_CNT + SECTION_DETAILS=() +} +finish() { + section_summary + printf '\n检查完毕:通过 %b%s%b 项,失败 %b%s%b 项。\n' \ + "$GREEN" "$PASS_CNT" "$NC" "$RED" "$FAIL_CNT" "$NC" + if [ "$FAIL_CNT" -gt 0 ]; then + printf '%b请按失败提示修正后重试。%b\n' "$RED" "$NC" + exit 1 + fi + printf '%b本次检查项全部通过。%b\n' "$GREEN" "$NC" + exit 0 +} -echo -e "${YELLOW}====================================================${NC}" -echo -e "${YELLOW} OpenStack KeyStone 身份认证部署自测脚本 ${NC}" -echo -e "${YELLOW}====================================================${NC}" +printf '%bOpenStack Keystone 身份认证自测%b\n' "$CYAN" "$NC" # 0. 检查是否为 root 用户 if [ "$EUID" -ne 0 ]; then - echo -e "${RED}请使用 root 权限执行此脚本!${NC}" + fail "请使用 root 权限执行此脚本" exit 1 fi # 1. 检查数据库配置与授权 -info "1. 检查 MariaDB 数据库创建与授权" +info "MariaDB 数据库创建与授权" if mysql -ukeystone -pkeystone -e "SHOW DATABASES;" 2>/dev/null | grep -q "keystone"; then pass "keystone 数据库已创建" else @@ -48,7 +85,7 @@ else fi # 2. 检查软件包安装 -info "2. 检查依赖软件包安装" +info "依赖软件包安装" if rpm -q openstack-keystone httpd mod_wsgi &>/dev/null; then pass "相关软件包 (keystone, httpd, mod_wsgi) 已全部安装" else @@ -56,7 +93,7 @@ else fi # 3. 检查 KeyStone 配置文件 -info "3. 检查 keystone.conf 配置文件" +info "keystone.conf 配置文件" if grep -q "^connection.*=.*mysql+pymysql://keystone:keystone@controller/keystone" /etc/keystone/keystone.conf 2>/dev/null; then pass "数据库连接 [database] 配置正确" else @@ -70,7 +107,7 @@ else fi # 4. 检查 Fernet 密钥 -info "4. 检查 Fernet 密钥库初始化" +info "Fernet 密钥库初始化" if [ "$(ls -A /etc/keystone/fernet-keys 2>/dev/null)" ] && [ "$(ls -A /etc/keystone/credential-keys 2>/dev/null)" ]; then pass "Fernet 与 Credential 密钥库已初始化" else @@ -78,7 +115,7 @@ else fi # 5. 检查 Apache HTTP 状态 -info "5. 检查 Apache (HTTPD) 服务状态" +info "Apache (HTTPD) 服务状态" if grep -iq "^ServerName controller" /etc/httpd/conf/httpd.conf 2>/dev/null; then pass "Apache ServerName 已配置为 controller" else @@ -105,24 +142,11 @@ export OS_IDENTITY_API_VERSION=3 export NO_PROXY=localhost,127.0.0.1,controller # 6. Admin 身份令牌签发测试 (Bootstrap 验证) -info "6. 检查 KeyStone Bootstrap 及管理员权限" +info "KeyStone Bootstrap 及管理员权限" if openstack token issue >/dev/null 2>&1; then pass "管理员 (admin) 成功签发 Token (Bootstrap 初始化成功)" else fail "管理员 (admin) 无法签发 Token,Bootstrap 可能失败或 Apache 未响应" - echo -e "${RED}后续针对域、项目、用户的检查由于无法认证,将跳过!${NC}" - FAIL_CNT=$((FAIL_CNT+5)) - goto_end=1 fi - - -echo "" -echo -e "${YELLOW}====================================================${NC}" -echo -e "检查完毕!通过项: ${GREEN}${PASS_CNT}${NC},失败项: ${RED}${FAIL_CNT}${NC}" -if [ ${FAIL_CNT} -eq 0 ]; then - echo -e "${GREEN}太棒了!KeyStone 服务已完美搭建且工作正常!${NC}" -else - echo -e "${RED}你有 ${FAIL_CNT} 处配置未达标,请对照 [✘ 失败] 的提示,参考手册检查数据库或相关配置文件。${NC}" -fi -echo -e "${YELLOW}====================================================${NC}" +finish