APP下载

Python在交换机自动化运维中的应用

2024-04-14王小霞李腾杨启超肖凝游闽王凯睿

现代信息科技 2024年1期
关键词:交换机

王小霞 李腾 杨启超 肖凝 游闽 王凯睿

DOI:10.19850/j.cnki.2096-4706.2024.01.028

收稿日期:2023-05-16

摘  要:交换机自动化运维是日常工程生产中的一个普遍问题,文章针对电力公司中广泛使用的华三交换机(S5500),将信息运维人员日常工作中有关交换机的大量重复性操作指令编写成Python脚本,解决了多台交换机同时操作时的耗时费力问题,具体来说就是多台交换机的账号密码不一致,管理复杂度高;交换机内部不同策略的指令复杂度不一致,对运维人员要求高等问题。交换机自动化运维切实提高了信息运维人员的工作效率和操作结果的准确性。

关键词:Python;自动化运维;交换机;Netmiko

中图分类号:TP311.1;TP391  文献标识码:A  文章编号:2096-4706(2024)01-0134-04

Application of Python in Automatic Operation and Maintenance of Switch

WANG Xiaoxia, LI Teng, YANG Qichao, XIAO Ning, YOU Min, WANG Kairui

(State Grid Nanchang Power Supply Company, Nanchang  330069, China)

Abstract: Automatic operation and maintenance of switches is a common problem in daily engineering production. This paper focuses on the widely used Huasan switch (S5500) in power companies, and compiles a large number of repetitive operation instructions related to switches in the daily work of information operation and maintenance personnel into Python scripts, solving the time-consuming and labor-intensive problem of multiple switches operating simultaneously. Specifically, the account passwords of multiple switches are inconsistent and the management complexity is high; the instruction complexity of different strategies within the switch is inconsistent, which poses high requirements for operation and maintenance personnel. Automatic operation and maintenance of switches has effectively improved the work efficiency and accuracy of operation results of information operation and maintenance personnel.

Keywords: Python; automatic operation and maintenance; switch; Netmiko

0  引  言

随着互联网的蓬勃发展和IT新技术的不断涌现,人们的生产生活方式逐渐趋于便捷化[1]。在传统国网信息运维过程中,交换机的维护往往占用工作人员大量的时间[2]。因此,仅仅依靠手工操作管理公司网络设备的做法已经远远不能满足信息运维人员的日常运维需求。

交换机配置的自动化势在必行。主要体现在以下几个方面:1)多线程执行交换机脚本。2)多台交換机账号密码的批量修改。3)交换机内部组策略的批量制定和执行等。这些操作基本上是运维人员每天都要做的重复性工作,采用网络自动化配置替代传统的手工配置,其效率更高,成本更低[3]。

本文以公司广泛使用的华三交换机(S5500)为例,将信息运维人员日常运维工作中有关交换机的大量重复性操作指令编写成Python脚本,实现批量交换机的自动化操作,有效提高信息运维人员的工作效率和操作结果的准确性。

1  问题及对策

问题一:多台交换机同时操作时耗时费力,人工多开进程繁杂易乱。

问题描述:在传统的日常网络维护工作中,信息运维人员需要手动配置n台交换机,首先登录SecureCRT,输入交换机的管理地址,选择通过远程登录服务的标准协议SSH进行登录(此过程大约耗时10~15秒);然后在登录界面中输入交换机的用户名和密码,运行配置命令,保存配置后退出交换机(此过程大约耗时3~5分钟);接下来对下一台交换机执行类似操作。

解决对策:利用Python中第三方库Gevent实现不同交换机多线程并发处理。该函数的优点就是便于切换控制流,简化编程模型。针对不同的交换机,只需导入交换机的IP地址表,一键执行脚本文件并发处理,大大提升了工作效率。

问题二:多台交换机的账号密码不一致,管理复杂度高。

问题描述:在传统的日常网络维护工作中,不同交换机的账号密码往往由多名信息运维人员创建和修改,而不同运维人员更换密码的时间不同,容易导致多台交换机存在同一时间密码不一致的问题,这样会给后续运维人员带来不必要的麻烦。

解决对策:利用Python中第三方库Netmiko实现同一时间批量修改不同交换机的账号密码。该函数的优点就是便于在交换机上批量处理指令[4]。针对不同的交换机,只需导入交换机的IP地址表,指定一名专员定期执行脚本文件,从而减少其他运维人员的工作量。

问题三:交换机内部不同策略的指令复杂度不一致,对运维人员要求高。

问题描述:在传统的日常网络维护工作中,需要对多个交换机的某一端口進行关闭,以及对不同信息运维人员的终端IP进行管理[5]。这些配置的复杂度不一,给运维人员的工作带来困扰。

解决对策:利用Python中第三方库Netmiko实现批量修改配置交换机策略。该函数的优点就是便于在交换机上批量处理指令。针对不同策略的配置写成不同函数,只需导入IP端口对应表或ACL用户权限表等即可实现批量处理指令。模块化的设计理念,使得后续功能可随意扩展,提升了代码的适用性。

2  典型做法

2.1  框架结构

本文针对公司大量网络设备需要重复性配置的情况,基于Python开源库Gevent、Netmiko设计如图1所示的自动化操作流程。该自动化操作流程通过Python编程方式实现对人工登录网络设备配置参数的计算机模拟[6],实现自动化的参数配置。

如图1所示,该自动化操作过程分为六个阶段:1)读取txt数据文件解析生成模板,主要借助Python内置函数open读取IP列表文件,作为脚本进行输入。2)实现交换机多线程并发处理,主要借助Python中第三方库Gevent多线程执行配置命令。3)建立Python与交换机的连接,主要借助Python中第三方库Netmiko实现后台操作交换机。4)实现批量同步修改登录密码。5)实现封端口、绑定IP-MAC等批量修改交换机策略配置。6)保存配置同时备份配置日志,便于日后维护和审计溯源。

整体代码结构如图2所示,包含read_device_txt()、Login_Multithread()、change_ Password()、strategy_Banport()、backup_Config()等函数。

2.2  编码思路

编写函数read_device_txt(),读取ip_lists.txt文件中交换机的管理IP、用户名和密码,利用Python中set集合生成形如(IP、username、password)格式的三元组数据,以便后续多线程读取数据,优化输入。

简单的代码示例如下:

defread_device_txt():

# 读取iplist.txt 里面的ip地址

ipread = open('iplist.txt', 'r', encoding='ascii')

ip_addr = ipread.readlines()

ipread.close()

iplist = []

for tmp in ip_addr:

tmp = tmp.replace("\n", "")

ip = tmp.split("")[0]

username = tmp.split("")[1]

password = tmp.split("")[2]

iptup = (ip, username, password)

iplist.append(iptup)

return iplist

利用Python中ThreadPoolExecutor模块实现多线程并发,每个线程后台开启一个交换机,可同时开启n(n≥2)个交换机进行处理,这样可节约大量时间:

defmain():

starting_time = time()

ip_list = read_device_txt()

#  异步线程ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=20) as executor:

result = executor.map(run_gevent, ip_list)

print('\n---- End get config threading, elapsed time=', time() - starting_time)

利用Python中第三方库Netmiko的ConnectHandler()模块,实现基于SSH远程控制Python与交换机的连接,编写函数run_gevent(),实现交换机多线程并行处理数据:

defrun_gevent(ipaddr):

issue_device = []

ip = ipaddr[0]

username = ipaddr[1]

password = ipaddr[2]

try:

S5130 = {

'device_type': 'hp_comware',

'ip': ip,

'username': username,

'password': password

}

net_connect = ConnectHandler(**S5130)

sucessloginip = ip

print('sucess: '+ sucessloginip)

except (AuthenticationException):

issue_message = (ipaddr +': 认证错误 ')

issue_device.append(issue_message)

except NetMikoTimeoutException:

issue_message = (ipaddr +': 网絡不可达 ')

issue_device.append(issue_message)

except (SSHException):

issue_message = (ipaddr +': SSH端口异常 ')

issue_device.append(issue_message)

exceptExceptionas unknown_error:

issue_message = (ipaddr +': 发生未知错误: ')

issue_device.append(issue_message + str(unknown_error))

编写函数changePassword (),实现批量修改交换机登录密码,该操作仅需一名运维人员定期执行脚本即可实现全网交换机密码同步,大大节约了人工成本:

defchangePassword(ip, username, password):

S5130 = {

'device_type': 'hp_comware',

'ip': ip,

'username': username,

'password': password

}

net_connect = ConnectHandler(**S5130)

cmd = ['undo password-control enable']  # 取消密码策略

cmd_result1 = net_connect.send_config_set(cmd)

cmd2 = ['local-user ngwl', 'display this', 'password simple xxxxxx']

cmd_result2 = net_connect.send_config_set(cmd2)

cmd_result3 = net_connect.save_config()  # 保存配置

net_connect.disconnect()

return ip

编写函数strategy_Banport(),通过设置高危端口的ACL策略,实现批量封闭高危端口,保障网络安全:

defstrategy_Banport(ip, username, password):

S5130 = {

'device_type': 'hp_comware',

'ip': ip,

'username': username,

'password': password

}

net_connect = ConnectHandler(**S5130)

cmd = ['acl number 3008',

'rule 1 deny tcp source-port eq 445',

'rule 2 deny tcp destination-port eq 445',

'rule 3 deny udp destination-port eq 445',

'rule 4 deny udp source-port eq 445',

'rule 5 deny tcp source-port eq 135',

'rule 6 deny tcp destination-port eq 135',

'rule 7 deny udp source-port eq 135',

'rule 8 deny udp destination-port eq 135',

'rule 9 deny udp destination-port eq 137',

'rule 10 deny udp source-port eq 137',

'rule 11 deny udp destination-port eq 138',

'rule 12 deny udp source-port eq 138',

'rule 13 deny udp destination-port eq 139',

'rule 14 deny udp source-port eq 139',

]  # 高危端口封禁

cmd_result1 = net_connect.send_config_set(cmd)

cmd2 = ['traffic classifier banPort operator and','if-match acl 3008']

cmd_result2 = net_connect.send_config_set(cmd2)

cmd3 = ['traffic behavior banPort','deny']

cmd_result3 = net_connect.send_config_set(cmd3)

cmd4 = ['traffic policy banPort','classifier banPort behavior banPort']

cmd_result4 = net_connect.send_config_set(cmd4)

cmd5 = ['qos apply policy banPort inbound','qos apply policy banPort outbound']

cmd_result5 = net_connect.send_config_set(cmd5)

cmd_result = net_connect.save_config()  # 保存配置

net_connect.disconnect()

return ip

最后,利用Netmiko库的save_config()方法后台保存修改过的交换机配置,同时使用backupConfig()函数进行数据备份,便于日后维护和审计溯源:

defbackupConfig(ip, username, password):

S5130 = {

'device_type': 'hp_comware',

'ip': ip,

'username': username,

'password': password

}

net_connect = ConnectHandler(**S5130)

commands = ['display current-configuration']  # dis cu

for cmd in commands:

cmd_result = net_connect.send_config_set(cmd)

timestr = time.strftime('%Y-%m-%d', time.localtime(time.time()))

filename =u'%s_%s_%s.txt'% (ip, cmd.replace(' ', '_'), timestr)

configsw = open(filename, 'w', encoding='ascii')

configsw.write(cmd_result)

print('命令執行完毕,结果保存于当前目录%s中!\n'+ filename)

cmd_result3 = net_connect.save_config()  # 保存配置

net_connect.disconnect()

return ip

3  效率分析

本文使用200台H3C(S5500)交换机进行对比,在将传统方法与本文提出的使用Python脚本对交换机进行相同操作时,比较二者所需时间的不同[7],详情如表1所示。由表1可知,使用Python脚本进行交换机运维时,所需的时间成本和人力成本远远低于传统方法。

4  结  论

本文利用IT领域炙手可热的Python编程语言实现了多台交换机配置的自动化处理,符合当今由繁入简的生活趋势,顺应AI引领生活的时代潮流。本文将繁杂的操作编写成Python脚本,仅需一名运维人员定期批量同步修改登录密码,实现了不同交换机的并发处理、批量一键执行不同交换机策略等功能。多台交换机的自动化操作,减少了运维人员的工作量和时间成本,且功能模块可扩展,操作日志可备份留存,便于后续二次开发和故障溯源。

参考文献:

[1] 叶磊,文涛,刘立亮,等.基于python的网络及信息系统安全过程管理工具 [J].数字技术与应用,2017(10):187-188.

[2] BOUNPASONG P.基于Python的网络系统自动化配置方案研究 [D].兰州:兰州交通大学,2020.

[3] 魏小梅,傅林,苗晶晶.一种基于命令的网络设备自动化运维工具 [J].科学技术创新,2021(32):96-98.

[4] 李朝阳,周波,张小锋,等.一种基于Netmiko的网络设备自动化运维方法研究 [J].通信技术,2021,54(3):773-778.

[5] 刘祥.网络设备自动化巡检运维的实现与应用研究 [J].信息系统工程,2019(6):92.

[6] 锁泉凝.基于Python的园区网络自动化运维 [J].长江信息通信,2021,34(6):74-75+78.

[7] 杨迎,李慧颖.Python在网络运维中的应用 [J].现代信息科技,2020,4(4);122-124.

作者简介:王小霞(1994—),女,汉族,江西南昌人,助理工程师,硕士,研究方向:信息安全;李腾(1992—),女,汉族,江西南昌人,工程师,硕士,研究方向:计算机网络;杨启超(1989—),男,汉族,江西南昌人,高级工程师,硕士,研究方向:计算机网络;肖凝(1997—),女,汉族,江西南昌人,助理工程师,硕士,研究方向:计算机网络;游闽(1984—),女,汉族,江西南昌人,高级工程师,硕士,研究方向:计算机网络;王凯睿(1975—),女,汉族,江西南昌人,高级工程师,硕士,研究方向:计算机网络。

猜你喜欢

交换机
基于地铁交换机电源设计思考
修复损坏的交换机NOS
使用链路聚合进行交换机互联
缔造工业级的强悍——评测三旺通信IPS7110-2GC-8PoE工业交换机
PoE交换机雷击浪涌防护设计
罗克韦尔自动化交换机Allen-Bradley ArmorStratix 5700