# 网络管理后台 **Repository Path**: ldzcyh/network-manage_admin ## Basic Information - **Project Name**: 网络管理后台 - **Description**: 网络管理后台的后段代码 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-24 - **Last Updated**: 2023-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 网络管理后台 ## 简介 ### 背景 ​ 做这个自动化平台的初衷是为了简化企业网络中网络工程师的工作。便于网络设备的管理。能够减少网络工程师枯燥,重复的工作。将生下来的时间对于其他更有意义的事情。 ​ 因为还未完成前端的部分,导致很多界面还没有出来。暂且写后段接口使用方法以及Celery的定时任务。 ### 主要功能 以下是要做的一些功能集合,可能有部分还未完成,后续要增加的也会写在这里面 - CMDB ​ 手工录入 ​ 批量录入(excel表) - 2、配置 ​ 配置备份,备份完检查与上一次备份不同的地方。并同时显示 ​ 配置生成 (未完成) ​ 给定模板excel,表头全部给定。然后生成对应的配置信息,可多设置 ​ 也可以自定义excel表头,通过自定义编码jinja2模板,生成模板 - 3、巡检 内置格式化模板,可以选择部分信息进行巡检,巡检结果前端表格形式,也可以通过excel下载,邮件发送 配置检查,输入部分配置代码,可以针对配置代码检查对应设备配置并给出是否合标 给定snmp密码组,巡检测试SNMP密码并输出到数据库留备后用 自定义命令,将巡检信息输出,需人工检查对错(可以设置对比)(未完成) LLDP自动化拓扑(SNMP)(SSH) - 4、工具 ​ 通过SNMP查询SN、设备型号、系统版本信息 ​ 通过sn查询维保时间 ​ textfsm测试(内置模板)(有网址备用) ​ 通过WEBSSH登入设备,可以互动填写信息。并且记录输入内容以及回显(未完成) ​ 业务检查,给定多个业务IP地址(域名或者IP地址),检查其可用性 ### 框架 ​ 主要使用的是python 语言 ​ 后端框架为 Django ​ 接口框架是 DRF ​ 异步操作为Celery ​ 前端为 Vue3以及elementUI(未完成) ## 安装(以下演示均为windows环境下) 执行以下步骤前请务必确认设备已安装python3.6或以上版本 ### 获取代码 代码被存放在gitee 上,仅仓库成员可见,目前采用的是邀请制。内测用户会面临着更多的BUG,但是也拥有提前感受新功能的权益。 地址:https://gitee.com/J-hidden/network-manage_admin.git 通过git 拉取代码 ```bash git clone https://gitee.com/J-hidden/network-manage_admin.git ``` ### 创建虚拟环境(可选) 建议是安装一个虚拟环境专门用于平台的搭建。如果安装了虚拟环境,每次执行操作前都需要进入虚拟环境操作 这部分可以百度解决 ### 安装模块 根目录下有一个 requirements.txt 文件,这部分文件记录了所使用的模块信息。通过以下命令安装所必须的模块 ```python pip install -r .\requirements.txt # windows pip install -r requirements.txt # linux ``` 这一步会比较慢,考虑到有一些模块比较大,所以小伙伴们可以加上清华大学源 ```python pip install -r .\requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # windows pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # linux ``` ### 安装依赖 #### redis 平台在异步方面使用了Celery模块,所以需要安装redis数据库 这块可以参考以下链接:https://www.runoob.com/redis/redis-tutorial.html 启动redis ```python cd src ./redis-server ``` 路径为:```Network_Manage_admin/settings.py``` ![image-20221108100211225](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221108100211225.png) 需将其中的```127.0.0.1```改成安装了redis数据库的服务器IP地址即可 #### 数据库 目前代码默认使用的是mysql数据库。msql搭建的部分可以自行百度 使用mysql可以更改```Network_Manage_admin/settings.py```中如下信息 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'NetworkManageAdmin', 'USER': 'root', 'PASSWORD':'123', 'HOST': 'localhost', 'PORT': '3306', } } ``` 需要先创建一个```NetworkManageAdmin```数据库,设置编码格式为utf8,不然数据无法接受中文字符会导致写入数据失败。 ##### 数据库迁移 ```bash (venv) [root@cute-gigs-2 network-manage_admin]# python manage.py makemigrations # 创建迁移文件 (venv) [root@cute-gigs-2 network-manage_admin]# python manage.py migrate # 执行迁移文件 (venv) [root@cute-gigs-2 network-manage_admin]# python .\manage.py createsuperuser 创建后台管理员用户 ``` ## 启动服务 ### 校验托管的uwsgi 查看文件 uwsgi文件的路径是否正确,默认配置是在root文件夹下。 ```home = /root/network-manage_admin/venv```意味着在虚拟环境下启动。虚拟环境为venv。如果没有虚拟环境或者是其他名称的注释或者更改即可 ```bash (venv) [root@cute-gigs-2 network-manage_admin]# vi uwsgi.ini [uwsgi] chdir = /root/network-manage_admin home = /root/network-manage_admin/venv module = Network_Manage_admin.wsgi:application master = True processes = 4 harakiri = 60 max-requests = 5000 http = :8000 pidfile = /root/network-manage_admin/master.pid vacuum = True static-map = /static=collect_static ``` 如果想对其中字段感兴趣的同学可以看同路径下的```uwsgi注释.ini```文件() ### 启动平台的WEB服务 启动命令: uwsgi --ini uwsgi.ini 停止命令: uwsgi --stop master.pid 重启命令:uwsgi --reload master.pid ## 启动Celery ### 启动 **启动celery windows下需要安装eventlet,否则任务一直pending** ```celery -A Network_Manage_admin worker -l info -P eventlet ``` **定时任务** ```celery -A Network_Manage_admin beat -l info -S django ``` ### 清空列队 celery -A 项目目录 purge ## 使用前检查 - redis是否后台启动 - 命令行是否启动 celery命令 > ```celery -A Network_Manage_admin worker -l info -P eventlet ``` > > ```celery -A Network_Manage_admin beat -l info -S django ``` - 是否执行了uwsgi --ini uwsgi.ini ## 模块讲解 ### CMDB #### Devices 资产表,主要功能是资产的登记,录入,以及为后续自动化的功能提供基础的数据。 ![image-20221107143059354](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107143059354.png) - 场地信息:企业网络中可能存在多个区域,可以通过城市命名或者内部命名 - 设备名称:设备的 sysname名称 - IP地址:设备的管理IP地址 - 厂商:Netmiko对应的device_type信息 - SSH端口:默认是22,可更改是为了有些防火墙为了安全会更改SSH端口 - 设备类型:这个字段是为了后面自动化拓扑类功能识别 - SN:该字段可以通过Celery的批量查询维保信息功能批量查询维保 - 责任人:后续增加任务功单时可以识别任务是谁创建的 - 型号:部分型号存在不同的命令 - 系统版本:部分型号存在不同的命令 - SN、型号、系统版本都是可选填的,后续可以通过登入设备去识别这类信息 初期比较多设备导入的时候,可以通过上面的导入导出功能进行大批量的数据导入导出。 **这里有基础的小伙伴可能就会发现没有要求输入SSH的账号和密码** 这是因为输入账号密码的话会存在一定的泄露情况,所以目前是要求在以下路径添加 ```Network_Manage_admin/settings.py``` image-20221108101947792 将SSH账号和密码替换XXXX即可 #### MailInfo 邮件信息记录表,只会保存最新输入的信息 后期在前端交换页面进行登记时会只记录最新的那个信息 ![image-20221107144913633](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107144913633.png) 可以设置多个接收人,不过接收人需要以;(英文)分隔。 该信息主要是定时任务完成时或统计一些关键信息后通知责任人 ### Config(设备配置) #### oxidized 该模块的信息是通过定时任务完成统计的,信息来源源自CMDB的输入信息。 ![image-20221107145445557](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107145445557.png) 定时任务的设置如果,只需要设置红框对应的三个地方内容即可。 Crontab为定时任务的循环次数,刚开始需要添加规则。这部分不了解可以百度一下。 ![image-20221107145724710](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107145724710.png) - ID:CMDB表的外键,对应CMDB的信息 - 最后一次的采集状态:代表最后一次采集是否成功 - 最后一次更新的时间:最后一次采集成功时的时间 - 最后一次更改的时间:如果配置存在差异,改时间则为当时采集配置时时间。 - 配置信息:设备运行时的 display cu信息 - 差异信息:设备配置更改后的比对信息 该模块不需要填写信息,只需要设置定时任务即可 ### Inquire(巡检) #### Inspect_result ![image-20221107150411255](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107150411255.png) 该模块主要用于巡检网络设备的一些配置是否符合标准(通过oxidized备份下来的配置巡检) - 任务ID:Celery任务返回的任务ID - 设备名称:CMDB中的设备名称 - IP地址:CMDB中的IP地址 - 场地:CMDB中的场地 - 检查开始文本:需要检查的配置开始信息 - 检查结束文件:需要检查的配置结束信息、 - 巡检结果:通过检查开始文本与检查结束文件 作为正则的开始与尾部正则匹配出的信息 该功能主要通过接口实现: - 接口地址:http://127.0.0.1:8000/inquire/Inspect_config/ - 方法:POST - 需要携带的参数: 1. manage_ip: 输入的IP信息,格式为 192.168.1.1;192.168.1.2(选填:与site_code可共存,但是必须要存在一个) 2. site_code:输入的场地信息,格式为 苏州;无锡 3. start:输入的查询开始信息,格式为 #ntp-service(必填) 4. end: 输入的查询结束信息, 例如 # (必填) 举例:http://127.0.0.1:8000/inquire/Inspect_config/?manage_ip=192.168.1.1&site_code=苏州&start=#ntp-service&end=# &end=# ### Tool(小工具) #### 业务检查 ##### 接口 在变更以及网络可靠性检查时,通常需要对一些关键设备或者域名进行可达性检测。 该功能主要通过接口实现: - 接口地址:http://127.0.0.1:8000/tools/check_work/ - 方法:POST - 需要携带的参数: 1. domains:IP地址以及域名的集合,通过;隔开 举例:http://127.0.0.1:8000/tools/check_work/?domains=www.baidu.com;www.aliyun.com;192.168.1.1 ##### 后台 路径为:域名和IP检测任务及结果 通过添加 IP地址或者域名来新增任务,后续通过定时任务来执行。 如果有多个IP地址或者域名来检测可以通过;隔开,如(192.168.0.1;www.baidu.com) ![image-20221129162635439](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/11%E6%9C%8829/image-20221129162559881.png) 结果展示如图 ![image-20221129162559881](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/11%E6%9C%8829/image-20221129162559881.png) 定时任务如下如图所示: ![image-20221129163026123](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/11%E6%9C%8829/image-20221129163026123.png) ### 定时任务 定时任务主要是通过Celery完成,因为是异步所以想要完成后通知就必需要填写MailInfo信息。 当新增定时任务时,Celery会自动扫描平台内所有预设好的任务信息,并将其显示在如下的下拉框中。 ![image-20221107152101111](https://gitee.com/J-hidden/draw-bed/raw/master/Network_Manage_Admin/image-20221107152101111.png) 目前需要用到的定时任务有 - CMDB所有设备配置备份及对比(上面有讲) - SNMP密码检测任务 - 批量查询设备SN维保信息 #### SNMP密码检测任务 在路径 ```Network_Manage_admin/utils``` 下存在一个```snmp_pass.yaml```文件,可以更改其中信息用来作为定时任务的数据源。 场景: ​ 当公司网络经历过很多人管理后可能会存在很多种SNMP的团体名,而网路设备和服务器设备可能又同时存在V2C或者V3的情况。这种情况就可以将已知的版本和密码写入到```snmp_pass.yaml```中,让程序检测对应的密码。便于后续的SN、型号、版本、拓扑图信息的采集 #### 批量查询设备SN维保信息 也是小工具之一,通过定时任务检测对应的网络设备的维保信息。如果设备变动比较小的情况下可以只执行一次。如果是设备变动情况比较快的情况还是定时好一些,任务不怎么占资源。 维保信息可以在admin后台的```tools/sninfo```查看 ## 问题记录 ### SQLite 3.9.0 or later is required (found 3.7.17). **目前源代码改了数据库为mysql。如果用sqlite会出现如下问题。mysql使用方法也在下方** 这是因为centous自带的 SQLite的版本比较低,要升级 ```bash [root@cute-gigs-2 ~]# cd ~ [root@cute-gigs-2 ~]# wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz [root@cute-gigs-2 ~]# tar -zxvf sqlite-autoconf-3270200.tar.gz [root@cute-gigs-2 sqlite-autoconf-3270200]# ./configure --prefix=/usr/local [root@cute-gigs-2 sqlite-autoconf-3270200]# make && make install # 检查安装的版本 [root@cute-gigs-2 network-manage_admin]# /usr/local/bin/sqlite3 --version 3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7 # 可以看到sqlite3的版本还是旧版本,那么需要更新一下。 [root@cute-gigs-2 network-manage_admin]# sqlite3 --version 3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668 # 备份原先的数据 [root@cute-gigs-2 network-manage_admin]# mv /usr/bin/sqlite3 /usr/bin/sqlite3_old # 软连接到安装的新版本 [root@cute-gigs-2 network-manage_admin]# ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3 # 设置开机自启动执行,可以将下面的export语句写入 ~/.bashrc 文件中,如果如果你想立即生效,可以执行source 〜/.bashrc 将在每次启动终端时执行 [root@cute-gigs-2 network-manage_admin]# export LD_LIBRARY_PATH="/usr/local/lib" ``` 但是发现sqlit3版本升上去了还是提示版本低。最终决定更换sqlite3 为pysqlite3 和 pysqlite3-binary ```bash [root@cute-gigs-2 network-manage_admin]# vim /root/network-manage_admin/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py #from sqlite3 import dbapi2 as Database # 注释这一条 from pysqlite3 import dbapi2 as Database #这一条就是将数据获取源改到pysqlite3 ``` 然后安装一下sqlite3 ```python pip install pysqlite3 ``` 当然这个模块后面会实现在requirements.txt写入