138 lines
6.3 KiB
Bash
Executable File
138 lines
6.3 KiB
Bash
Executable File
#!/bin/bash
|
||
# OpenStack 控制节点(Rocky)基础环境检查脚本
|
||
# 适用于: 3.1 控制节点环境准备
|
||
|
||
# 学生可见输出:每组一行,失败时列出原因;仅统计实际检查结果。
|
||
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 控制节点基础环境自测%b\n' "$CYAN" "$NC"
|
||
|
||
# 0. 检查是否为 root 用户
|
||
if [ "$EUID" -ne 0 ]; then
|
||
fail "请使用 root 权限(或 sudo)执行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
# 1. 基础安全设置
|
||
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 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 "主机名配置"
|
||
if [ "$(hostname)" == "controller" ]; then pass "主机名已设置为 controller"; else fail "主机名错误,当前为 $(hostname),应为 controller"; fi
|
||
|
||
# 3. NTP 时间同步
|
||
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 "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 "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 配置文件存在"
|
||
if grep -q "bind-address" /etc/my.cnf.d/openstack.cnf; then pass "数据库 bind-address 已配置"; else fail "数据库 bind-address 未配置"; fi
|
||
if grep -q "max_connections.*=.*4096" /etc/my.cnf.d/openstack.cnf; then pass "最大并发连接已设置为 4096"; else fail "最大并发未调至 4096"; fi
|
||
else
|
||
fail "openstack.cnf 配置文件不存在"
|
||
fi
|
||
if systemctl is-active mariadb &>/dev/null; then pass "mariadb 服务正在运行"; else fail "mariadb 服务未运行"; fi
|
||
|
||
# 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
|
||
pass "RabbitMQ 存在 openstack 用户"
|
||
if rabbitmqctl list_user_permissions openstack 2>/dev/null | grep -q "\.\*"; then
|
||
pass "RabbitMQ openstack 用户权限分配正确"
|
||
else
|
||
fail "RabbitMQ openstack 用户权限不正确"
|
||
fi
|
||
else
|
||
fail "RabbitMQ 未找到 openstack 用户"
|
||
fi
|
||
else
|
||
fail "rabbitmq-server 服务未运行"
|
||
fi
|
||
|
||
# 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 "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_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
|
||
|
||
finish
|