refactor: 优化 OpenStack Keystone 服务部署检查脚本的输出格式

This commit is contained in:
seahi committed 2026-09-30 15:23:55 +08:00
1 parent 9226e2522d
commit 89b0f1e68e
1 file changed
+55 -31
+55 -31
View File
@@ -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