#!/bin/bash # NetBox 一键安装脚本 # 适用于 CentOS 9 Stream # 作者:Claude # 版本:1.0.1 # 严格模式 set -euo pipefail IFS=$'\n\t' # 定义变量 BASE_DIR="/home" NETBOX_DIR="$BASE_DIR/netbox" VENV_DIR="$BASE_DIR/venv" NETBOX_CONFIG_DIR="$NETBOX_DIR/netbox/netbox" LOG_FILE="$BASE_DIR/netbox_install.log" DB_NAME="netbox" DB_USER="netbox" DB_PASS="your_secure_password" # 配置日志 exec 1> >(tee -a "$LOG_FILE") 2>&1 echo "开始安装 NetBox - $(date)" # 错误处理 error_handler() { local line_no=$1 echo "错误发生在第 ${line_no} 行" exit 1 } trap 'error_handler ${LINENO}' ERR # 清理函数 cleanup_services() { echo "清理现有服务和数据..." echo "停止服务..." sudo systemctl stop netbox nginx redis postgresql || true echo "清理运行时目录..." sudo rm -rf /var/run/netbox/* || true echo "清理 PostgreSQL 数据..." if [ -d "/var/lib/pgsql/data" ]; then sudo -u postgres dropdb netbox || true sudo -u postgres dropuser netbox || true fi echo "清理 NetBox 目录..." sudo rm -rf "$NETBOX_DIR" || true echo "清理 Python 虚拟环境..." sudo rm -rf "$VENV_DIR" || true echo "清理日志文件..." sudo rm -f /var/log/netbox*.log || true echo "清理 Redis 数据" sudo systemctl stop redis sudo rm -rf /var/lib/redis/* || true echo "清理 nginx 配置" sudo rm -f /etc/nginx/conf.d/netbox.conf || true echo "清理系统服务配置" sudo rm -f /etc/systemd/system/netbox.service || true echo "重新加载系统服务" sudo systemctl daemon-reload echo "清理完成" } # 检查依赖 check_dependencies() { echo "检查并安装系统依赖..." # 添加必要的仓库 sudo dnf install -y epel-release sudo dnf config-manager --set-enabled crb # 更新系统 sudo dnf update -y # 安装开发工具组 sudo dnf groupinstall -y "Development Tools" # 安装 SELinux 相关依赖 echo "安装 SELinux 依赖..." sudo dnf install -y \ policycoreutils-python-utils \ python3-policycoreutils \ python3-libselinux \ python3-libsemanage \ python3-setools \ setroubleshoot-server \ setools-console # 安装其他必要依赖 echo "安装其他系统依赖..." sudo dnf install -y \ python3.12 \ python3.12-pip \ python3.12-devel \ postgresql-server \ postgresql-contrib \ postgresql-devel \ nginx \ redis \ git \ gcc \ libpq-devel \ libffi-devel \ openssl-devel \ libxml2-devel \ libxslt-devel \ libjpeg-devel \ zlib-devel # 修改 Python 3.12 设置部分 if [ -f "/usr/bin/python3.12" ]; then sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1 sudo alternatives --set python3 /usr/bin/python3.12 || { echo "警告:无法设置 Python 3.12 为默认版本,但将继续安装..." } else echo "警告:未找到 Python 3.12,将使用系统默认的 Python 版本..." fi echo "系统依赖安装完成" } # 配置 PostgreSQL setup_database() { echo "配置 PostgreSQL 数据库..." # 确保 PostgreSQL 数据目录存在 if [ ! -d "/var/lib/pgsql/data" ]; then sudo mkdir -p /var/lib/pgsql/data sudo chown postgres:postgres /var/lib/pgsql/data fi # 确 PostgreSQL 已初始化 if [ ! -f /var/lib/pgsql/data/PG_VERSION ]; then echo "初始化 PostgreSQL 数据库..." # 使用 -E UTF8 显式指定编码,并使用 postgres 用户执行命令 sudo -u postgres /usr/bin/postgresql-setup --initdb # 等待初始化完成 sleep 5 fi # 确保 PostgreSQL 服务已启动 if ! systemctl is-active --quiet postgresql; then echo "启动 PostgreSQL 服务..." sudo systemctl start postgresql # 予服务足够的启动时间 sleep 10 fi # 验证 PostgreSQL 是否正在运行 if ! pg_isready -q; then echo "错误:PostgreSQL 服务未能正确启动" sudo systemctl status postgresql exit 1 fi # 修改 PostgreSQL 认证配置 echo "配置 PostgreSQL 认证方式..." sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak # 使用更安全的方式修改 pg_hba.conf sudo tee /var/lib/pgsql/data/pg_hba.conf > /dev/null < /dev/null < /dev/null; then echo "安装 Redis..." sudo dnf install -y redis fi # 备份并修改 Redis 配置 if [ -f /etc/redis.conf ]; then sudo cp /etc/redis.conf /etc/redis.conf.bak # 修改 Redis 配置 sudo tee /etc/redis.conf > /dev/null </dev/null; then echo "Redis 已成功启动" break fi if [ $i -eq 30 ]; then echo "Redis 启动失败,请检查日志: sudo journalctl -u redis" exit 1 fi sleep 1 done } # 主函数 main() { echo "开始安装 NetBox..." # 询问是否需要清理 read -p "是否清理现有安装?(y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then cleanup_services fi check_dependencies setup_redis setup_database install_netbox configure_netbox setup_services echo "NetBox 安装成功完成!" echo "请使用以下凭据访问 NetBox:" echo "URL: http://your-server-ip" echo "用户名: admin" echo "密码: admin" echo "请务必在首次登录后修改密码!" echo "注意:如果无法访问,请确保已配置防火墙允许 HTTP 访问(端口 80)" } # 执行主函数 main#!/bin/bash # NetBox 一键安装脚本 # 适用于 CentOS 9 Stream # 作者:Claude # 版本:1.0.1 # 严格模式 set -euo pipefail IFS=$'\n\t' # 定义变量 BASE_DIR="/home" NETBOX_DIR="$BASE_DIR/netbox" VENV_DIR="$BASE_DIR/venv" NETBOX_CONFIG_DIR="$NETBOX_DIR/netbox/netbox" LOG_FILE="$BASE_DIR/netbox_install.log" DB_NAME="netbox" DB_USER="netbox" DB_PASS="your_secure_password" # 配置日志 exec 1> >(tee -a "$LOG_FILE") 2>&1 echo "开始安装 NetBox - $(date)" # 错误处理 error_handler() { local line_no=$1 echo "错误发生在第 ${line_no} 行" exit 1 } trap 'error_handler ${LINENO}' ERR # 清理函数 cleanup_services() { echo "清理现有服务和数据..." echo "停止服务..." sudo systemctl stop netbox nginx redis postgresql || true echo "清理运行时目录..." sudo rm -rf /var/run/netbox/* || true echo "清理 PostgreSQL 数据..." if [ -d "/var/lib/pgsql/data" ]; then sudo -u postgres dropdb netbox || true sudo -u postgres dropuser netbox || true fi echo "清理 NetBox 目录..." sudo rm -rf "$NETBOX_DIR" || true echo "清理 Python 虚拟环境..." sudo rm -rf "$VENV_DIR" || true echo "清理日志文件..." sudo rm -f /var/log/netbox*.log || true echo "清理 Redis 数据" sudo systemctl stop redis sudo rm -rf /var/lib/redis/* || true echo "清理 nginx 配置" sudo rm -f /etc/nginx/conf.d/netbox.conf || true echo "清理系统服务配置" sudo rm -f /etc/systemd/system/netbox.service || true echo "重新加载系统服务" sudo systemctl daemon-reload echo "清理完成" } # 检查依赖 check_dependencies() { echo "检查并安装系统依赖..." # 添加必要的仓库 sudo dnf install -y epel-release sudo dnf config-manager --set-enabled crb # 更新系统 sudo dnf update -y # 安装开发工具组 sudo dnf groupinstall -y "Development Tools" # 安装 SELinux 相关依赖 echo "安装 SELinux 依赖..." sudo dnf install -y \ policycoreutils-python-utils \ python3-policycoreutils \ python3-libselinux \ python3-libsemanage \ python3-setools \ setroubleshoot-server \ setools-console # 安装其他必要依赖 echo "安装其他系统依赖..." sudo dnf install -y \ python3.12 \ python3.12-pip \ python3.12-devel \ postgresql-server \ postgresql-contrib \ postgresql-devel \ nginx \ redis \ git \ gcc \ libpq-devel \ libffi-devel \ openssl-devel \ libxml2-devel \ libxslt-devel \ libjpeg-devel \ zlib-devel # 修改 Python 3.12 设置部分 if [ -f "/usr/bin/python3.12" ]; then sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1 sudo alternatives --set python3 /usr/bin/python3.12 || { echo "警告:无法设置 Python 3.12 为默认版本,但将继续安装..." } else echo "警告:未找到 Python 3.12,将使用系统默认的 Python 版本..." fi echo "系统依赖安装完成" } # 配置 PostgreSQL setup_database() { echo "配置 PostgreSQL 数据库..." # 确保 PostgreSQL 数据目录存在 if [ ! -d "/var/lib/pgsql/data" ]; then sudo mkdir -p /var/lib/pgsql/data sudo chown postgres:postgres /var/lib/pgsql/data fi # 确 PostgreSQL 已初始化 if [ ! -f /var/lib/pgsql/data/PG_VERSION ]; then echo "初始化 PostgreSQL 数据库..." # 使用 -E UTF8 显式指定编码,并使用 postgres 用户执行命令 sudo -u postgres /usr/bin/postgresql-setup --initdb # 等待初始化完成 sleep 5 fi # 确保 PostgreSQL 服务已启动 if ! systemctl is-active --quiet postgresql; then echo "启动 PostgreSQL 服务..." sudo systemctl start postgresql # 予服务足够的启动时间 sleep 10 fi # 验证 PostgreSQL 是否正在运行 if ! pg_isready -q; then echo "错误:PostgreSQL 服务未能正确启动" sudo systemctl status postgresql exit 1 fi # 修改 PostgreSQL 认证配置 echo "配置 PostgreSQL 认证方式..." sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak # 使用更安全的方式修改 pg_hba.conf sudo tee /var/lib/pgsql/data/pg_hba.conf > /dev/null < /dev/null < /dev/null; then echo "安装 Redis..." sudo dnf install -y redis fi # 备份并修改 Redis 配置 if [ -f /etc/redis.conf ]; then sudo cp /etc/redis.conf /etc/redis.conf.bak # 修改 Redis 配置 sudo tee /etc/redis.conf > /dev/null </dev/null; then echo "Redis 已成功启动" break fi if [ $i -eq 30 ]; then echo "Redis 启动失败,请检查日志: sudo journalctl -u redis" exit 1 fi sleep 1 done } # 主函数 main() { echo "开始安装 NetBox..." # 询问是否需要清理 read -p "是否清理现有安装?(y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then cleanup_services fi check_dependencies setup_redis setup_database install_netbox configure_netbox setup_services echo "NetBox 安装成功完成!" echo "请使用以下凭据访问 NetBox:" echo "URL: http://your-server-ip" echo "用户名: admin" echo "密码: admin" echo "请务必在首次登录后修改密码!" echo "注意:如果无法访问,请确保已配置防火墙允许 HTTP 访问(端口 80)" } # 执行主函数 main