Files

153 lines
5.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# OpenStack 控制节点(Rocky) KeyStone 服务部署检查脚本
# 适用于: 3.2 KeyStone服务部署
# 学生可见输出:每组一行,失败时列出原因;仅统计实际检查结果。
RED='\033[0;31m'
GREEN='\033[0;32m'
CYAN='\033[0;36m'
NC='\033[0m'
PASS_CNT=0
FAIL_CNT=0
SECTION_TITLE=''
SECTION_PASS=0
SECTION_FAIL=0
SECTION_DETAILS=()
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
}
printf '%bOpenStack Keystone 身份认证自测%b\n' "$CYAN" "$NC"
# 0. 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
fail "请使用 root 权限执行此脚本"
exit 1
fi
# 1. 检查数据库配置与授权
info "MariaDB 数据库创建与授权"
if mysql -ukeystone -pkeystone -e "SHOW DATABASES;" 2>/dev/null | grep -q "keystone"; then
pass "keystone 数据库已创建"
else
fail "keystone 数据库未创建"
fi
if mysql -ukeystone -pkeystone -e "SHOW DATABASES;" &>/dev/null; then
pass "keystone 数据库用户授权正确 (可正常登录)"
# 顺便检查 DB_SYNC 是否成功
if [ $(mysql -ukeystone -pkeystone -e "USE keystone; SHOW TABLES;" 2>/dev/null | wc -l) -gt 2 ]; then
pass "keystone 数据库表结构已成功同步 (db_sync)"
else
fail "keystone 数据库表为空,未执行同步或同步失败"
fi
else
fail "keystone 数据库用户授权失败或密码不匹配"
fi
# 2. 检查软件包安装
info "依赖软件包安装"
if rpm -q openstack-keystone httpd mod_wsgi &>/dev/null; then
pass "相关软件包 (keystone, httpd, mod_wsgi) 已全部安装"
else
fail "部分软件包未安装,请检查是否遗漏"
fi
# 3. 检查 KeyStone 配置文件
info "keystone.conf 配置文件"
if grep -q "^connection.*=.*mysql+pymysql://keystone:keystone@controller/keystone" /etc/keystone/keystone.conf 2>/dev/null; then
pass "数据库连接 [database] 配置正确"
else
fail "数据库连接 [database] 配置不匹配"
fi
if grep -q "^provider.*=.*fernet" /etc/keystone/keystone.conf 2>/dev/null; then
pass "令牌 [token] 认证类型已按要求设置为 fernet"
else
fail "令牌 [token] 的 provider 未设置为 fernet"
fi
# 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
fail "Fernet 密钥目录为空,未执行 fernet_setup"
fi
# 5. 检查 Apache HTTP 状态
info "Apache (HTTPD) 服务状态"
if grep -iq "^ServerName controller" /etc/httpd/conf/httpd.conf 2>/dev/null; then
pass "Apache ServerName 已配置为 controller"
else
fail "Apache ServerName 未配置正确"
fi
if [ -L /etc/httpd/conf.d/wsgi-keystone.conf ]; then
pass "WSGI 虚拟主机链接已创建"
else
fail "wsgi-keystone.conf 的软链接不存在"
fi
if systemctl is-active httpd &>/dev/null; then pass "httpd 服务正在运行"; else fail "httpd 服务未运行"; fi
if systemctl is-enabled httpd &>/dev/null; then pass "httpd 服务已允许开机自启"; else fail "httpd 未设置开机自启"; fi
# 导入临时管理员环境变量用于后续 API 测试
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export NO_PROXY=localhost,127.0.0.1,controller
# 6. Admin 身份令牌签发测试 (Bootstrap 验证)
info "KeyStone Bootstrap 及管理员权限"
if openstack token issue >/dev/null 2>&1; then
pass "管理员 (admin) 成功签发 Token (Bootstrap 初始化成功)"
else
fail "管理员 (admin) 无法签发 Token,Bootstrap 可能失败或 Apache 未响应"
fi
finish