NetBox 4.4.1 自动化安装脚本,一键安装

boyanx3个月前技术教程14

复制下面的内容,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 "$@"

标签: superadmin

相关文章

SpringBoot 使用 Sa-Token 完成路由拦截鉴权

一、需求分析在前文,我们详细的讲述了在 Sa-Token 如何使用注解进行权限认证,注解鉴权虽然方便,却并不适合所有鉴权场景。假设有如下需求:项目中所有接口均需要登录认证校验,只有 “登录接口” 本身...

【SpringBoot系列教程五】一文学会SpringSecurity

对于一些重要的操作,有些请求需要用户验明身份后才可以进行;有时候,可能需要与第三方公司合作,存在系统之间的交互,这时也需要验证合作方身份才能处理业务。这样做的意义在于保护自己的网站安全,避免一些恶意攻...

Vue3.5 + Node.js + Express 实现完整登录注册鉴权流程

在前后端项目里,登录注册和权限鉴权基本算是 “老大难” 问题。做得不严谨,系统就会有漏洞;做得太复杂,又会让开发效率大打折扣。这篇文章,我结合 Vue3.5 和 Node.js + Express,...

英国特种部队装具(4)——曼彻斯特恐怖袭击,2017年5月

接上期,这期我们来讲一讲在曼彻斯特恐袭中出现的另一位SAS的装具。对唔住,其实我是CRW 这位帅哥身穿黑色作战服,虽然图片较为模糊但是可以通过肩膀魔术贴为两列而不是一整块判断出来是Crye Preci...

Golang之Gorm学习笔记_golang mpi

一、模型定义1. 模型定义模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成,如:type User struct {...

自营性电商项目④_自营式电商平台缺点

类别管理--根据id查询类别详情--持久层13.1. 规划SQL语句本次需要执行的SQL语句大致是:select * from pms_category where id=?关于字段列表,应该包括:i...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。