王小霞 李騰 楊啟超 肖凝 游閩 王凱睿



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—),女,漢族,江西南昌人,高級工程師,碩士,研究方向:計算機網絡。