李朝阳,周 波,张小锋,陈 震
(中国西昌卫星发射中心,四川 西昌 615000)
随着各种IT 新技术的不断涌现,依靠手工执行命令管理软硬件资源的方法已经远不能满足一个信息中心的日常运维需求,且传统方法存在出错率高和人力资源成本高等缺陷。试想一个1 000 台网络设备的架构中,按照传统人为操作更新设备配置,可能需要一个星期的多人合作。如果采用网络自动化进行多线程并行操作,将大大缩减运维对人力资源的依赖,进一步节约成本。可见,在今天的网络技术领域,如何能够满足大规模网络灵活高效且高质稳定运维的极致需求,是所有IT 管理部门应该积极思考的问题。同时,网络基础设施建设和运维管理的标准化、自动化、数据可视化以及智能化必将成为大趋势。本文针对一个由千余台网络设备组成的企业生产网需要进行大量重复性配置需求的特定应用场景,提出了一种基于Python3 开源库构建网络设备自动化运维系统的解决方法并加以编程实现,进而为进一步提升信息中心网络运维自动化水平提供技术基础和服务。
主流远程管理控制协议主要有:①远程桌面协议(Remote Desktop Protocol,RDP),应用于Windows 系统远程桌面;②远程帧缓冲协议(Remote Frame Buffer Protocol,RFB),应用于图形化远程管理,如VNC 工具基于RFB;③Telnet 协议;④SSH 协议。本文重点讨论后两者的特点及区别。Telnet 是命令行界面远程管理协议,简单易于实现,在进行数据传输时采用明文传输方式。安全外壳协议(Secure Shell,SSH)是另外一种命令行界面远程管理协议,在进行数据传输时会对数据进行加密及压缩。相比较而言,SSH 更加安全,速度也更快,且代替Telnet 仅是SSH 的功能之一。
Telnetlib 是Python 的内建模块。鉴于Telnet 存在安全隐患,不建议在生产网络中使用Telnetlib 库。Python2 和Python3 中的Telnetlib 在使用方式上略有区别。在Python2 中,Telnetlib 模块下所有函数返回值均为字符串,而在Python3 环境下,所有函数参数及返回值为字节型字符串(Byte Strings)。因此,在Python3 中使用Telnetlib 需要关注:①字符串常量前需加b 提示符;②变量后需借助encode 进行ASCII 编码;③对于read_all 函数返回结果需借助decode 进行ASCII 解码。
Python 中支持SSH 协议实现远程连接设备的模块主要有Paramiko 和Netmiko,前者是后者开发的基础。Paramiko 是Python 中的一个非常著名的开源SSHV2 项目,于2013 年发布,同时支持SSH服务端和客户端。Netmiko[1]是另一个SSHV2 开源项目,于2014 年底发布。Netmiko 基于Paramiko 开发,但其支持更多厂商设备,更加方便易用,简化了回显结果获取,简化了设备的配置命令[2]。目前,它支持包括Cisco、HP proCurve、Juniper Junos、Linux、Alcatel A0s6、Dell KS9 以及huawei 在内的多个厂商设备。
Pandas(Python Data Analysis Library)是基于Numpy 的一个工具集,专为解决数据分析任务而创建。Pandas 纳入了大量库和一些标准数据模型,为大型数据集提供高效的操作工具。同时,Pandas 是Python 的一个数据分析包,最初被作为金融数据分析工具而研发,在时间序列数据分析方面表现卓越。Pandas 的主要组件是Series 和Dataframe[3]。本文主要以Pandas 为工具对各个单位提交上来的Excel 数据进行清洗和处理,从中提炼出各类交换机加固命令参数。
Python 第三方日志库loguru 相较于自带loging库更加简洁、高效且灵活。Loguru 日志输出格式信息丰富,包含时间、级别、模块名、行号及日志信息;loguru 支持输出日志到多个文件,按级别输出;loguru 会定时清理超大日志文件,以提高系统运行效率[4]。本文借助loguru 模块主要实现两个功能:①记录数据文件清洗处理过程中产生的各类日志;②记录程序核心模块运行时产生的各类日志信息。
本文针对较大规模企业网中的网络设备需要定期大量重复性配置的需求场景,基于Python 开源库Netmiko 设计如图1 所示的体系结构图。该设计重点包括1 个自动化操作流程和5 个软件功能模块[5]两个方面。
图1 中的一个自动化操作通过编程方式实现对人工登录网络设备进行操作配置活动的计算机模拟,以求实现配置操作自动化目标的过程。该设计将一个自动化操作流程分为如图1 所示的6 个阶段。第1 阶段,数据核对阶段,主要借助正则表达式对输入的Excel 数据规范性和有效性进行核实检查;第2 阶段,数据处理节点,主要依照实际任务需求完成对清洗、解析、参数提取及模板生成等工作;第3 阶段,设备过滤阶段,主要完成对特殊设备的排查;第4 阶段,登录方式修改阶段,基于安全因素及Netmiko 高效应用的考量,通过Telnet 方式将设备修改为SSH 密码模式,如果已经为SSH 方式则不做处理;第5 阶段,登录方式验证阶段,为确保核心动作的有效执行,对SSH 密码登录参数进行验证;第6 阶段,配置运行阶段,主要完成对设备的自动化操作,从而实现运维效率的大幅提升。
图1 程序结构设计示意
根据实际应用需求,该设计将最终编程实现的自动化运维程序功能分为数据解析处理模块、设备地址过滤模块、设备登录配置模块、日志信息记录模块和配置命令执行模块[7]。
对于数据解析处理模块ExcelParserHandler 而言,主要基于Pandas 完成对不同部门提交的网络设备配置参数的提取工作,为基于参数模板构造网络设备配置命令提供基础服务;对于设备地址过滤模块SWIPFilterHandler 而言,主要基于Pythonping实现,用于对不在线或者特殊设备的过滤;对于设备登录配置模块SSHLoginHandler 而言,主要基于Telnetlib 实现,将所有设备登录方式修改为SSH 密码模式登录,一方面为Netmiko 执行远程操控打下基础,另一方面也是出于对生产网络安全加固的考量;对于日志信息记录模块LogRecordHandler 而言,主要基于loguru 实现,完成对软件5 个功能模块运行过程中产生的各类文本信息及异常情况进行记录,以备后续故障排查及结果验证所用;对于配置命令执行模块CommandsHandler 而言,基于Netmiko 实现,该模块是整个运维程序开发实现的重点和核心,完成对各类大量重复性配置命令和系统升级操作的自动化工作。
上述5 个模块皆基于国产麒麟操作系统以Python3 类的形式实现,在自动化操作流程的各个关键节点,通过对上述5 个功能模块类的实例化而获得相应操作对象,从而执行相应操作完成相应的自动化功能。
本文对如图1 所示设计方法在国产麒麟操作系统上基于Python 进行编程实践时,以网络设备运维自动化操作流程为主线,以框架搭建设计为基石,以模块动态加载来应对运维任务的多样性和不确定性,从而保持基于Netmiko 的自动化运维程序的稳定性和良好可扩展性。限于篇幅,本文以ExcelParserHandler模块和CommandHandler为重心,阐述该自动化运维程序的编程实现细节。
功能模块ExcelParserHandler基于Pandas库实现,主要完成对不同部门提交的Excel 文件进行数据清洗和数据解析,从而获得批量配置交换机所需的各类参数,在配置模板作用下批量生成交换机配置命令。
示例伪码如下:
核心模块CommandHandler基于Netmiko以Python3类的方式实现,具体细节如伪码所示,主要完成以SSH 方式实现对大规模网络设备配置操作和系统升级的自动化运行。在实际应用实践中,应将该类的实例化置于线程中,从而实现对千余台网络设备配置管理的并行运行,在提高效率的同时,确保程序运行的稳定性和健壮性。鉴于篇幅所限,本文仅给出关键步骤的伪码表示。
笔者对本文所述自动化运维程序分别在华为eNSP 模拟器构建的网络拓扑和一个由500 余台网络设备架构组成的实际生产网络中均进行测试和部署,运行效果良好。在实际应用中,本文所述自动化运维方法可根据实际需求进行多样化任务定制。以笔者所处实际生产网络环境为例(见图2),利用该自动化运维程序对部门A 中网络设备进行相关网络加固操作,对部门B 中网络设备进行定期配置文件备份操作,对部门C 中的网络设备进行系统升级操作,对部门D 中网络设备进行QoS 参数修改操作,其中每种任务只需根据需求变换配置模板即可。
同时,详尽的日志记录功能确保应用过程中的过程可追溯,为批量自动化运维提供支持。图3 为该自动化运维程序在对部门A 中网络交换机进行批量自动地址绑定操作时所生成的日志信息,详细记录了配置脚本在远程交换机上的执行过程。
图2 自动化运维程序应用场景
图3 运行日志记录
文章在对当前信息中心网络运维工作中面临的困难和挑战进行深入分析的基础上,提出了一种基于Netmiko 构建企业信息中心网络设备自动化运维系统的解决思路,设计自动化运维程序的体系结构图,并且在国产麒麟操作系统上基于Python3 进行了编程实现,将其部署应用于实际生产环境,完成了网络加固、系统升级、配置备份及QoS 参数修改等大量重复性操作,取得了良好应用效果。实践表明,本文所述方法稳妥可靠,可操作性强,具有良好的可扩展性和先进性。