摘要
在网络运维中,面临着网络运维人员水平的层次不齐,为了能够定期维护网络环境中设备的配置信息,故设计以下程序,来初步实现网络配置的定期检查以及自动化备份与操作。
本系统由Python通过用户自定义的网络运维方式,周期性的检测网络设备配置的变更情况,计算并记录配置的MD5信息以及自动备份配置至数据库中。
第1章 引言
1.1 课题背景
网络运维至今,网络系统越来越庞大,为了维持系统的稳定性,能够在定期的备份网络设备的配置信息变得越来越重要。
1.2 目的和意义
通过此系统,实现7*24小时的网络配置检测以及定期的将配置信息保存至数据库实现备份。
1.3 系统设计思想
本系统后端通过Python获取思科网络设备的配置数据,将数据解析并且落盘到SQLite,以实现配置的定期备份。
1.4 系统开发环境
操作系统:Windows 10
开发工具:Pycharm
服务器:Linux CentOS 7
数据库:SQLite
1.5 系统运行要求
后端获取数据,因为数据量不大,使用SQLite进行存储。
第2章 需求分析
2.1 系统功能分析
在Python 3.6环境中,使用paramiko进行远程登录操作, hashlib计算MD5, sqlite3作为数据库。
2.2 系统整体业务流程
第3章 总体设计
3.1 系统总体设计
实时监控基于Python程序开发语言,主要分为监控模块,存储模块与数据库模块。
监控模块:主要负责定期登录检测设备配置状态
存储模块:负责数据存储、读取/查询
数据库模块:作为存储模块的支撑,负责创建数据库
3.1.1 系统模块功能
通过监控模块获取设备的实时状态,再由存储模块判断是否更新创新数据库。
3.2 数据库设计概述
3.2.1 数据库选择
系统采用SQLite作为数据库。SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,不需要在系统中配置。
就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
3.2.2 数据库特性
在 SQLite 中,SQL92 不支持的特性如下所示:
3.3.2 数据表的设计
图1:数据表及细节表
第4章 详细设计
4.1 数据获取(paramiko)
4.1.1 获取网络设备配置信息
代码讲解:
通过paramiko使用ssh的方式登录网络设备,获取需要的配置信息。
代码如下:
import paramiko
def qytang_ssh(ip, username, password, port='22', cmd='sh run'):
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port=port, username=username, password=password, timeout=5, compress=True)
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
ssh.close()
return str(result)
代码1:paramiko 实现SSH登录
4.2 数据存储(SQLite)
Python与MySQL连接,需要通过sqlite3(import sqlite3)
4.2.1 与数据库连接/关闭
代码讲解:设置连接数据库必要的属性,创建连接,建立游标,返回conn、cursor
4.2.2 创建数据库表格
代码如下:
import sqlite3
conn = sqlite3.connect('qytangconfig.sqlite')
cursor = conn.cursor()
cursor.execute("create table config_md5 (ip varchar(40), config varchar(99999), md5_config varchar(999))")
代码2:sqlite 实现数创建据库
4.3计算MD5值(hashilib)
为了确保获取数据的唯一性,我们将获取的数据进行MD5校验,通过对比MD5数据确保能够准确地知道配置是否发生变化。
4.3.1获取配置并计算MD5值
from qytang_ssh import *
import hashlib
import re
import sqlite3
def get_config_md5(ip,username,password):
try:
# ssh提前将没编码的字符串返回到函数,通过re模块找到hostname~end之间的配置
run_config_raw = qytang_ssh2(ip, username, password)
run_config = re.search('hostnam[\s\S]*end', run_config_raw).group()
#计算md5值
m = hashlib.md5()
m.update(run_config.encode())
md5_value = m.hexdigest()
#返回 配置以及md5
return run_config,md5_value
except Exception:
print("报错")
return
代码3:hashlib实现计算MD5值
4.4数据处理
代码讲解:
通过4.2.1创建数据库的连接,通过预设的设备list递归查询需要检查的设备信息,通过4.1.1返回的配置信息,交给4.3.1计算MD5值,对比MD5值的差异确定是否存入数据库。
并且运行结束,最终打印输出整张数据库的信息。
4.1.4 实现配置对比MD5并更新数据库
def write_config_md5_to_db():
conn = sqlite3.connect('qytangconfig.sqlite')
cursor = conn.cursor()
# 逐个迭代读取设备信息,并写入数据库
for device in device_list:
# 获取配置以及md5信息
config_and_md5 = get_config_md5(device,username,password)
# 查询数据库中,是否包含此设备的md5信息
cursor.execute(f"select md5_config from config_md5 where ip='{device}'")
# 查询结果赋值
md5_result = cursor.fetchall()
# 如何为空,则写入,否则比较md5值,改变则写入db
if not md5_result:
# print('test1')
# cursor.execute(f"insert into config_md5 values ('{device}', '{config_and_md5}[0]', '{config_and_md5}[1]')")
cursor.execute("insert into config_md5 values ('%s','%s','%s')"%(device,config_and_md5[0],config_and_md5[1]))
else:
# 对比新旧MD5
if md5_result[0][0] == config_and_md5[1]:
continue
else:
cursor.execute("update config_md5 set config='%s',md5_config='%s' where ip = '%s'"
%(config_and_md5[0], config_and_md5[1],device))
cursor.execute("select * from config_md5")
all_result = cursor.fetchall()
# 打印IP和MD5
for x in all_result:
print(f"IP:{x[0]},MD5:{x[2]}")
conn.commit()
cursor.close()
conn.close()
代码4:实现配置读取对比MD5并更新创建数据库
第5章 实验展示
截图说明:
第一次运行时的结果:
分别记录了2台监控设备的IP + MD5信息,以及数据库中存储了相应的配置数据。
图1:第一次测试--数据表及细节表
第二次运行时的结果:
本次修改了192.168.6.100单台网络设备的配置信息:hostname RR37256
MD5值以及数据库都进行了更新!
图2:第二次测试—修改单设备配置,数据表及细节表
第6章 系统测试
6.1 测试方案概述
测试环境: Linux Centos 7
测试平台: Python 3.6、SQLite
测试功能:
1、是否正确获取到配置数据
2、是否正确落盘到数据库
6.2 测试计划与实施
6.2.1 是否正确获取到配置数据
左:设备测运行中的配置 右:数据库中获取的配置
6.2.2 是否正确落盘到数据库
图6.2.2数据库查询的详细配置信息
通过本次实验,增强了python的语法使用,其次初步掌握SQL操作的过程,并且明白了读写操作的整个流程。
在系统开发过程中遇到许多问题,通过不断查阅资料来解决,也认识到本系统仍有许多可以改进的地方,比如应该使用自动调度技术循环运行脚本,通过此方式可以记录详细的运行信息,使得后台能够拥有详细的日志信息等等。
[1] Python基础教程
[2] SQLite 基础操作
[3] Python与SQLite交互
[4] 乾颐堂-乾颐盾系列Python课程支持
致谢
学习语言的过程,单单学习语法是很枯燥的,最好的学习方式是以项目为导向进行学习,这样才能边在实操过程中掌握基础语法的使用,虽说不能面面俱到,但能完成工作即可。通过这次的实验我收获颇丰,希望以后可以更进一步。感谢老师的付出,谢谢老师!