NetBox 4.4.1 自动化安装脚本,一键安装
复制下面的内容,centos 保存为install.sh,设置执行权限,./install.sh
*******************************
#!/bin/bash
# NetBox 4.4.1 自动化安装脚本(修复版)by 大牛蛙
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 安全执行函数(不因错误退出)
safe_exec() {
local cmd="$1"
local description="$2"
log_info "执行: $description"
if eval "$cmd"; then
log_success "$description 完成"
return 0
else
log_warning "$description 执行有警告,但继续执行"
return 1
fi
}
# 重试函数(关键操作)
retry_command() {
local cmd="$1"
local description="$2"
local max_attempts=3
local attempt=1
while [ $attempt -le $max_attempts ]; do
log_info "尝试执行: $description (第 $attempt 次)"
if eval "$cmd"; then
log_success "$description 成功"
return 0
else
log_warning "$description 失败,准备重试..."
sleep 3
((attempt++))
fi
done
log_error "$description 重试 $max_attempts 次后仍然失败"
return 1
}
# 关键检查函数(失败则退出)
critical_check() {
local cmd="$1"
local description="$2"
log_info "关键检查: $description"
if eval "$cmd"; then
log_success "$description 通过"
return 0
else
log_error "$description 失败,安装中止"
exit 1
fi
}
# 显示当前步骤
show_step() {
echo -e "\n${GREEN}========================================${NC}"
echo -e "${GREEN} 步骤 $1: $2 ${NC}"
echo -e "${GREEN}========================================${NC}\n"
}
# 主安装函数
main() {
show_step "1" "系统准备"
log_info "检查系统架构和版本"
critical_check "uname -m" "架构检查"
critical_check "cat /etc/redhat-release || cat /etc/centos-release" "系统版本检查"
# 安全执行防火墙和SELinux设置(允许失败继续)
safe_exec "systemctl disable --now firewalld" "关闭防火墙"
safe_exec "sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config" "禁用SELinux配置"
safe_exec "setenforce 0" "临时禁用SELinux" # 即使已经禁用也继续
log_info "安装基础工具"
retry_command "dnf install tree vim bash-completion tar -y" "安装基础工具"
show_step "2" "安装和配置 PostgreSQL"
log_info "安装 PostgreSQL 16"
retry_command "dnf module install postgresql:16 -y" "安装PostgreSQL 16"
log_info "初始化数据库"
if [ ! -f "/var/lib/pgsql/data/postgresql.conf" ]; then
postgresql-setup --initdb
critical_check "test -f
/var/lib/pgsql/data/postgresql.conf" "数据库初始化检查"
else
log_info "数据库已初始化,跳过"
fi
log_info "修改认证方式"
safe_exec "sed -i 's/ident$/scram-sha-256/g'
/var/lib/pgsql/data/pg_hba.conf" "修改认证方式"
log_info "启动 PostgreSQL"
safe_exec "systemctl enable --now postgresql" "启动PostgreSQL服务"
log_info "创建数据库和用户"
safe_exec "sudo -u postgres psql -c \"ALTER USER postgres WITH PASSWORD 'adminpassword123';\"" "设置PostgreSQL密码"
safe_exec "sudo -u postgres psql -c \"CREATE DATABASE netboxdb;\"" "创建NetBox数据库"
show_step "3" "安装和配置 Redis"
log_info "安装 Redis"
retry_command "dnf module install redis:7 -y" "安装Redis"
log_info "设置 Redis 密码"
if ! grep -q "requirepass adminpassword123" /etc/redis/redis.conf; then
echo "requirepass adminpassword123" >> /etc/redis/redis.conf
fi
log_info "启动 Redis"
safe_exec "systemctl enable --now redis" "启动Redis服务"
log_info "验证 Redis 连接"
retry_command "redis-cli -a adminpassword123 ping" "Redis连接测试"
show_step "4" "安装 Python 3.12"
log_info "安装 Python 3.12 和相关工具"
retry_command "dnf install python3.12 python3.12-pip python3.12-devel python3-pip -y" "安装Python 3.12"
show_step "5" "安装 NetBox 依赖"
log_info "安装系统依赖包"
retry_command "dnf install gcc libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config git wget -y" "安装系统依赖"
show_step "6" "创建 NetBox 用户和目录"
log_info "创建 NetBox 用户"
if ! id "netbox" &>/dev/null; then
useradd -r -d /opt/netbox -s /usr/sbin/nologin netbox
log_success "创建NetBox用户"
else
log_info "NetBox用户已存在"
fi
log_info "下载 NetBox 4.4.1"
mkdir -p /opt
cd /opt
if [ ! -f "v4.4.1.tar.gz" ]; then
retry_command "wget
https://github.com/netbox-community/netbox/archive/refs/tags/v4.4.1.tar.gz" "下载NetBox"
else
log_info "NetBox 安装包已存在,跳过下载"
fi
log_info "解压 NetBox"
if [ ! -d "netbox-4.4.1" ]; then
tar -zxvf v4.4.1.tar.gz
fi
ln -sf netbox-4.4.1 netbox
log_info "设置目录权限"
chown -R netbox:netbox /opt/netbox*
chown -R netbox:netbox /opt/netbox-4.4.1
show_step "7" "配置 NetBox"
log_info "切换到配置目录"
cd /opt/netbox/netbox/netbox
log_info "复制配置文件"
if [ ! -f "configuration.py" ]; then
sudo -u netbox cp configuration_example.py configuration.py
fi
log_info "生成 SECRET_KEY"
cd /opt/netbox/netbox
SECRET_KEY=$(sudo -u netbox python3 generate_secret_key.py)
cd /opt/netbox/netbox/netbox
log_info "配置 SECRET_KEY"
sudo -u netbox sed -i "s/^SECRET_KEY = .*/SECRET_KEY = '$SECRET_KEY'/" configuration.py
log_info "写入配置文件"
sudo -u netbox tee -a configuration.py > /dev/null << EOF
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'netboxdb',
'USER': 'postgres',
'PASSWORD': 'adminpassword123',
'HOST': 'localhost',
'PORT': '',
'CONN_MAX_AGE': 300,
}
}
REDIS = {
'tasks': {
'HOST': 'localhost',
'PORT': 6379,
'PASSWORD': 'adminpassword123',
'DATABASE': 0,
'SSL': False,
},
'caching': {
'HOST': 'localhost',
'PORT': 6379,
'PASSWORD': 'adminpassword123',
'DATABASE': 1,
'SSL': False,
}
}
ENABLE_LOCALIZATION = True
DEFAULT_LANGUAGE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
EOF
show_step "8" "安装 NetBox 应用"
log_info "配置 pip 国内源"
cd /opt/netbox
mkdir -p /opt/netbox/.config/pip
chown -R netbox:netbox /opt/netbox/.config
sudo -u netbox tee /opt/netbox/.config/pip/pip.conf > /dev/null << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
log_info "运行安装脚本"
critical_check "sudo -u netbox PYTHON=/usr/bin/python3.12 ./upgrade.sh" "NetBox应用安装"
show_step "9" "创建管理员账户"
log_info "创建超级用户(非交互式)"
cd /opt/netbox/netbox
critical_check "echo \"from django.contrib.auth import get_user_model; User = get_user_model();
User.objects.create_superuser('admin', 'admin@example.com', 'adminpassword123')\" | sudo -u netbox
/opt/netbox/venv/bin/python manage.py shell" "创建管理员账户"
show_step "10" "安装额外插件"
log_info "安装 dulwich 插件"
safe_exec "sudo -u netbox /opt/netbox/venv/bin/pip install dulwich" "安装dulwich插件"
show_step "11" "配置系统服务"
log_info "配置 Gunicorn"
sudo -u netbox cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
log_info "安装系统服务"
cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
systemctl daemon-reload
log_info "启动 NetBox 服务"
safe_exec "systemctl enable --now netbox netbox-rq" "启动NetBox服务"
log_info "配置定时任务"
ln -sf /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
show_step "12" "配置 Nginx 反向代理"
log_info "安装 Nginx"
retry_command "dnf install nginx -y" "安装Nginx"
log_info "创建 Nginx 配置"
tee /etc/nginx/conf.d/netbox.conf > /dev/null << EOF
server {
listen 80;
server_name _;
client_max_body_size 25m;
location /static/ {
alias /opt/netbox/netbox/static/;
}
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host \$http_host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
log_info "启动 Nginx"
safe_exec "systemctl enable --now nginx" "启动Nginx服务"
show_step "13" "验证安装"
log_info "检查服务状态"
systemctl status netbox --no-pager -l | head -10
systemctl status nginx --no-pager -l | head -10
log_info "检查端口监听"
ss -tlnp | grep -E '(8001|80)' || log_warning "端口监听检查失败"
log_info "测试访问(等待服务启动)"
sleep 10
if curl -I http://localhost &>/dev/null; then
log_success "NetBox 访问测试成功"
else
log_warning "NetBox 访问测试失败,服务可能还在启动中"
fi
show_step "14" "安装完成"
log_success "NetBox 4.4.1 安装完成!"
log_info "访问地址: http://你的服务器IP"
log_info "用户名: admin"
log_info "密码: adminpassword123"
log_info ""
log_info "关键目录说明:"
log_info "NetBox 根目录: /opt/netbox/"
log_info "配置文件:
/opt/netbox/netbox/netbox/configuration.py"
log_info "管理命令:
/opt/netbox/netbox/manage.py"
log_info "虚拟环境: /opt/netbox/venv/"
# 显示数据库连接测试
log_info "数据库连接测试:"
PGPASSWORD=adminpassword123 psql -h localhost -U postgres -d netboxdb -c "SELECT version();" 2>/dev/null && log_success "数据库连接正常" || log_warning "数据库连接测试失败"
}
# 显示开始信息
echo -e "${GREEN}开始 NetBox 4.4.1 自动化安装${NC}"
echo -e "${YELLOW}注意: 此脚本会修改系统配置,请确保在合适的环境运行${NC}"
echo -e "${YELLOW}按 Ctrl+C 在 5 秒内取消安装...${NC}"
sleep 5
# 执行主函数(不再使用 set -e)
main "$@"