diff --git a/3.1.sh b/3.1.sh new file mode 100644 index 0000000..b8ed11e --- /dev/null +++ b/3.1.sh @@ -0,0 +1,112 @@ +#!/bin/bash +# OpenStack 控制节点(Rocky)基础环境检查脚本 +# 适用于: 3.1 控制节点环境准备 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +CYAN='\033[0;36m' +NC='\033[0m' # 恢复默认颜色 + +PASS_CNT=0 +FAIL_CNT=0 + +# 打印函数 +pass() { echo -e "${GREEN}[✔ 通过] $1${NC}"; ((PASS_CNT++)); } +fail() { echo -e "${RED}[✘ 失败] $1${NC}"; ((FAIL_CNT++)); } +info() { echo -e "${CYAN}[➜] $1${NC}"; } + +echo -e "${YELLOW}====================================================${NC}" +echo -e "${YELLOW} OpenStack 控制节点基础配置自测脚本 ${NC}" +echo -e "${YELLOW}====================================================${NC}" + +# 0. 检查是否为 root 用户 +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}请使用 root 权限(或 sudo)执行此脚本!${NC}" + exit 1 +fi + +# 1. 基础安全设置 +info "1. 检查基础安全配置 (防火墙与 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 + +# 2. 主机名配置 +info "2. 检查主机名配置" +if [ "$(hostname)" == "controller" ]; then pass "主机名已设置为 controller"; else fail "主机名错误,当前为 $(hostname),应为 controller"; fi + +# 3. NTP 时间同步 +info "3. 检查 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 源" +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 数据库配置" +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 "6. 检查 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 "7. 检查 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 分布式存储系统" +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 + +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}" +