From 9226e2522d6e82681153b5f0f24c51523acd8549 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=20?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E8=8A=82=E7=82=B9=E5=9F=BA=E7=A1=80=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E6=A3=80=E6=9F=A5=E8=84=9A=E6=9C=AC=E7=9A=84=E8=BE=93?= =?UTF-8?q?=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.1.sh | 95 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/3.1.sh b/3.1.sh index b8ed11e..1f84da6 100755 --- a/3.1.sh +++ b/3.1.sh @@ -2,57 +2,93 @@ # OpenStack 控制节点(Rocky)基础环境检查脚本 # 适用于: 3.1 控制节点环境准备 -# 颜色定义 +# 学生可见输出:每组一行,失败时列出原因;仅统计实际检查结果。 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 控制节点基础配置自测脚本 ${NC}" -echo -e "${YELLOW}====================================================${NC}" +printf '%bOpenStack 控制节点基础环境自测%b\n' "$CYAN" "$NC" # 0. 检查是否为 root 用户 if [ "$EUID" -ne 0 ]; then - echo -e "${RED}请使用 root 权限(或 sudo)执行此脚本!${NC}" + fail "请使用 root 权限(或 sudo)执行此脚本" exit 1 fi # 1. 基础安全设置 -info "1. 检查基础安全配置 (防火墙与 SELinux)" +info "基础安全配置 (防火墙与 SELinux)" if systemctl is-active firewalld &>/dev/null; then fail "firewalld 防火墙仍处于运行状态"; else pass "防火墙(firewalld)已关闭"; fi if systemctl is-enabled firewalld &>/dev/null; then fail "firewalld 防火墙未禁止开机自启"; else pass "防火墙(firewalld)已禁止自启"; fi -if getenforce | grep -iq "Disabled\|Permissive"; then pass "SELinux 当前已关闭"; else fail "SELinux 当前仍处于开启(Enforcing)状态"; fi -if grep -q "^SELINUX=disabled" /etc/selinux/config; then pass "SELinux 配置文件已永久关闭"; else fail "SELinux 配置文件(/etc/selinux/config)未设置为 disabled"; fi +if getenforce 2>/dev/null | grep -iq "Disabled\|Permissive"; then pass "SELinux 当前已关闭"; else fail "SELinux 当前仍处于开启(Enforcing)状态"; fi +if grep -q "^SELINUX=disabled" /etc/selinux/config 2>/dev/null; then pass "SELinux 配置文件已永久关闭"; else fail "SELinux 配置文件(/etc/selinux/config)未设置为 disabled"; fi # 2. 主机名配置 -info "2. 检查主机名配置" +info "主机名配置" if [ "$(hostname)" == "controller" ]; then pass "主机名已设置为 controller"; else fail "主机名错误,当前为 $(hostname),应为 controller"; fi # 3. NTP 时间同步 -info "3. 检查 NTP 时间同步 (Chrony)" +info "NTP 时间同步 (Chrony)" if rpm -q chrony &>/dev/null; then pass "chrony 软件包已安装"; else fail "chrony 软件包未安装"; fi if grep -q "allow all" /etc/chrony.conf 2>/dev/null; then pass "chrony 已配置允许所有网段同步"; else fail "chrony 未配置允许所有网段同步"; fi if systemctl is-active chronyd &>/dev/null; then pass "chronyd 服务正在运行"; else fail "chronyd 服务未运行"; fi # 4. 运行环境配置 (Yum 源与客户端) -info "4. 检查 OpenStack 运行环境与 Yum 源" +info "OpenStack 运行环境与 Yum 源" if rpm -q centos-release-openstack-rocky &>/dev/null; then pass "Rocky Release 源已安装"; else fail "Rocky Release 源未安装"; fi if grep -q "mirrors.aliyun.com" /etc/yum.repos.d/CentOS-OpenStack-rocky.repo 2>/dev/null; then pass "Yum 源已成功替换为阿里云"; else fail "Yum 源未替换为阿里云"; fi if rpm -q python2-openstackclient &>/dev/null; then pass "OpenStackClient已安装"; else fail "OpenStackClient未安装"; fi # 5. 数据库配置 -info "5. 检查 MariaDB 数据库配置" +info "MariaDB 数据库配置" if rc=0; rpm -q mariadb mariadb-server python2-PyMySQL &>/dev/null; then pass "MariaDB相关软件包已安装"; else fail "MariaDB相关软件包缺失"; fi if [ -f /etc/my.cnf.d/openstack.cnf ]; then pass "openstack.cnf 配置文件存在" @@ -64,7 +100,7 @@ fi if systemctl is-active mariadb &>/dev/null; then pass "mariadb 服务正在运行"; else fail "mariadb 服务未运行"; fi # 6. RabbitMQ 消息队列 -info "6. 检查 RabbitMQ 消息队列" +info "RabbitMQ 消息队列" if systemctl is-active rabbitmq-server &>/dev/null; then pass "rabbitmq-server 服务正在运行" if rabbitmqctl list_users 2>/dev/null | grep -q "^openstack"; then @@ -82,31 +118,20 @@ else fi # 7. Memcached 缓存服务 -info "7. 检查 Memcached 缓存服务" +info "Memcached 缓存服务" if rpm -q memcached python-memcached &>/dev/null; then pass "memcached 软件包已安装"; else fail "memcached 软件包未安装"; fi if grep -q "controller" /etc/sysconfig/memcached 2>/dev/null; then pass "memcached 监听参数包含了 controller"; else fail "memcached 配置文件 OPTIONS 中缺少 controller"; fi if systemctl is-active memcached &>/dev/null; then pass "memcached 服务正在运行"; else fail "memcached 服务未运行"; fi - - # 8. Etcd 服务 -info "8. 检查 Etcd 分布式存储系统" +info "Etcd 分布式存储系统" if rpm -q etcd &>/dev/null; then pass "etcd 软件包已安装"; else fail "etcd 软件包未安装"; fi if [ -f /etc/etcd/etcd.conf ]; then - if grep -q "ETCD_NAME=\"controller\"" /etc/etcd/etcd.conf; then pass "etcd 名城配置为 controller"; else fail "etcd 未设置 ETCD_NAME 为 controller"; fi + if grep -q "ETCD_NAME=\"controller\"" /etc/etcd/etcd.conf; then pass "etcd 名称配置为 controller"; else fail "etcd 未设置 ETCD_NAME 为 controller"; fi if grep -q "ETCD_LISTEN_PEER_URLS" /etc/etcd/etcd.conf; then pass "etcd 集群 URL 已配置"; else fail "etcd URL 相关参数未配置全"; fi else fail "etcd.conf 配置文件不存在" fi if systemctl is-active etcd &>/dev/null; then pass "etcd 服务正在运行"; else fail "etcd 服务未运行"; 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}恭喜!你已完美完成本节实验,所有关键服务与进程正常!可以继续下一节。${NC}" -else - echo -e "${RED}你有 ${FAIL_CNT} 处配置不符合要求,请根据列表中的 [✘ 失败] 提示向上翻阅实验手册并排查修正!${NC}" -fi -echo -e "${YELLOW}====================================================${NC}" - +finish