Files
OpenStackScripts/3.1.sh
T

138 lines
6.3 KiB
Bash
Executable File
Raw 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)基础环境检查脚本
# 适用于: 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