交换机配置管理Web服务
TIP
当前项目属于一个学习项目,其实主要是学习一下前后端分离的项目如何写,加上工作后刚好负责网络运维部分工作,基于Django写了内部的项目,功能比当前肯定丰富。随着AI编程的兴起,就打算结合免费AI将部分核心功能做一个基础的Demo加深学习,本项目结合了一些实际工作中的运维经验,希望能实际工作中对提高运维效率和运维自动化开发学习有所帮助。
项目背景
当前系统内交换机数量大概有2k多台,网络架构走的MPLS-VPN,设备主要涉及思科、华为、华三等厂家。虽然各厂家现在主推各自的云管平台,都实现了配置下发、对比等等核心功能,但是不同厂商之间的适配度其实不是很好,并且运维内部肯定希望将自己的一些工作经验(工单自动化、设备统计、配置对比、告警分析等等)加入到自动化当中,所以单独开发一个配置管理工具是有一定的作用的。
主要参考并使用的开源项目
主要是将shadcn的ui替换为full-stack-fastapi-template中的frontend,然后借助netmiko实现了主要功能。
Switch Manager是一个基于 FastAPI 和 React 的全栈应用程序,用于管理和监控网络交换机配置。
项目前的一些思考
- 这不是一个监控工具,监控当前主流zabbix+grafana是一个不错的选择。
- 设备登录认证主流应该还是aaa服务器,本项目中的巡检账号的权限也是要特别注意。
- 这也不是一个ssh工具,webssh和webtelnet实现并不复杂,你可以轻松的将其加入本项目。
- 备份的时间选择当前是每天保留一份,但我看类似的项目中保存很多,优雅的保存应该是如果配置没有发生变化,那么可以保存一个指针指向上一次的配置即可
功能
WARNING
当前测试的设备型号cisco_ios、cisco_nxos、hp_comware(华三)、huawei(CE系列和S系列),以上几种型号下列功能都支持,如果您的设备型号不在上述其中,您可以手动进行代码的卡法,后续给出代码所在具体位置。
已经实现的功能
- 交换机批量导入和导出,巡检账号、分址自动创建,配置查看
- 三种定时任务,全量备份、仅备份失败(部分设备每天开关机)、ARP刷新
- IP表、VRF、ARP表信息生成
- 每日配置变更和自定义设备配置对比
- 巡检账号和分址自定义管理
- 设备型号自动识别
尚未完成的功能
- 后台运行日志前端展示
- webssh开发
- ...
Quick Start
初始化项目
强烈建议手动学习项目环境搭建,虽然当前Docker很方便(但如果纯内外部署代理配置也比较复杂),但是有很多小的问题(例如桥接IP和内网地址冲突)解决起来不如本地环境舒服,当然这只是个人的建议。
前置环境
官网的脚本足够支持您安装本项目的所有依赖:
- postgresql
- pythong管理 uv
- node.js
全局配置
全局配置文件 .env,由于没有开启Email配置,所以仅需配置如下内容,项目开始前应该创建好数据库,并且给账户超级权限用于数据库操作。
# Backend
SECRET_KEY=yylime
FIRST_SUPERUSER=admin@admin.com
FIRST_SUPERUSER_PASSWORD=admin@123
# Postgres
POSTGRES_SERVER=db
POSTGRES_PORT=5432
POSTGRES_DB=app
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres后端
cd backend
# 创建python虚拟环境
uv sync
# 启动后端
source .venv/bin/activate
# 初始化db
sh ./scripts/prestart.sh
# 启动
fastapi dev app/main.py前端
这里要注意开发环境要配置 frontend/.env中的 VITE_API_URL=http://localhost:8000。同时注意 frontend/openapi-ts.config.ts中input和后端API端口一致。
cd frontend
# 我习惯使用pnpm
npm install -g pnpm
# 安装依赖
pnpm install
# openapi生成
pnpm generate-client
# 启动
pnpm run dev然后您可以使用.env中的账号密码来访问前端 http://localhost:5173
开始使用
每日定时任务才会开启dashboard的Card统计信息
- 登录后点击交换机,点击导出,按照导出表的内容进行填写交换机内容后进行导入
- 管理 -> 定时任务 -> 新增备份定时任务即可
- 常用表格 -> 立即刷新
简要开发指南
交换机型号检测
backend/app/services/switches/config/stype_detect.py 中的 StypeDetect.best_match() 方法实现了系统常用的型号检测,您可以自行考虑新增。也增加了netmiko的SSHDetect,它支持很多型号,也支持本项目实现的,但是它要遍历不同的厂商速度会慢并且仅支持ssh,所以这里优先使用手动实现的检测逻辑。核心逻辑如下
class StypeDetect:
def best_match(self) -> str:
commands = ["display version\n", "show version\n", "version\n"]
for cmd in commands:
stype = None
res = self.send_commond(cmd)
if "huawei" in res.lower():
stype = "huawei"
elif "H3C" in res or "h3c" in res.lower():
stype = "hp_comware"
elif (
"Cisco IOS Software" in res
or "Cisco Internetwork Operating System Software" in res
):
stype = "cisco_ios"
elif "NX-OS" in res or "Cisco Nexus Operating System" in res or "NOS-CN" in res:
stype = "cisco_nxos"
elif "Fabric OS" in res:
stype = "brocade_fos"
if stype:
self.close()
return stype
return "cisco_ios"
def paramiko_detect_stype(
ip: str, username: str, password: str, login_type="ssh", port=22
) -> str | None:
try:
detector = StypeDetect(ip, username, password, login_type, port)
res = detector.best_match()
if res is None:
# try netmiko autodetect
remote_device = {
"device_type": "autodetect",
"host": ip,
"username": username,
"password": password,
"port": port
}
res = SSHDetect(remote_device).autodetect()
return res
except Exception as e:
logging.info(f"[!] Detect failed for {ip}: {e}")
return None