Python實(shí)現(xiàn)批量備份交換機(jī)配置+自動(dòng)巡檢
自動(dòng)巡檢功能考慮到不同設(shè)備回顯有所不同,需要大量正則匹配,暫時(shí)沒(méi)時(shí)間搞這些,所以索性將命令回顯全部顯示,沒(méi)做進(jìn)一步的回顯提取。
以下是程序運(yùn)行示例:
#自動(dòng)備份配置:

備份完成后,將配置保存于程序目錄下的conf_bak文件夾下,如圖所示:


#自動(dòng)巡檢交換機(jī)設(shè)備:

使用前需創(chuàng)建excel文檔,寫(xiě)入設(shè)備登錄信息,格式如下:

本人編碼能力一般,勿噴,源碼:
# coding=utf-8
from netmiko import ConnectHandler
from openpyxl import load_workbook
import os
from sys import exit
from netmiko import exceptions
import re
# 讀取excel內(nèi)設(shè)備列表信息
def check_and_get_dev_list(filename, sheet_name):
excel_information = []
sheet_header = []
wb = load_workbook(filename)
sh = wb[sheet_name]
# 獲取最大行數(shù)
row = sh.max_row
# 獲取最大列數(shù)
column = sh.max_column
data = []
# 獲取表頭寫(xiě)入列表中方便調(diào)用
for data_1 in range(1, column+1):
get_sheet_header = sh.cell(row=1, column=data_1).value
sheet_header.append(get_sheet_header)
# 第一行為表頭, 此處 row +1 是pyton循環(huán)時(shí)不讀取最后一個(gè)數(shù)
for row_1 in range(2, row + 1):
# 存儲(chǔ)一行信息
sheet_data_1 = dict()
# 逐行讀取表中的數(shù)據(jù)
for b in range(1, column + 1):
cell = sh.cell(row=row_1, column=b).value
# 將數(shù)據(jù)已字典形式寫(xiě)入 sheet_data_1 中
# if cell != None:
sheet_data_1[sheet_header[b-1]] = cell
excel_information.append(sheet_data_1)
for i in excel_information:
if i['ip'] != None:
data.append(i)
return data
#獲取excel數(shù)據(jù)并整合成dev字典
def get_dev():
res = check_and_get_dev_list('./resource.xlsx', 'Sheet1')
devices = []
for i in res:
if i['protocol'] == 'telnet':
i['type'] = i['type']+'_telnet'
dev = {'device_type':i['type'],
'host': i['ip'],
'username': i['username'],
'password': i['password'],
'secret': i['enpassword'],
'port': i['port'],}
devices.append(dev)
return devices
# 配置批量備份導(dǎo)出
def devices_confbak(devices=''):
# 創(chuàng)建備份文件夾
try:
path = './conf_bak'
os.makedirs(path)
except FileExistsError:
pass
# 存儲(chǔ)連接失敗的IP
failed_ips = []
# 循環(huán)登錄設(shè)備獲取配置
for dev in devices:
try:
with ConnectHandler(**dev) as conn:
print('\n----------成功登錄到:' + dev['host'] + '----------')
conn.enable()
if 'cisco_ios' in dev['device_type']:
output = conn.send_command(command_string='show run')
elif 'huawei' or 'hp_comware' in dev['device_type']:
output = conn.send_command(command_string='dis current-configuration')
else:
print('error')
with open('./conf_bak/'+ dev['host'] +'_conf_bak.txt', mode='w', encoding='utf8') as f:
print('正在備份:'+dev['host'])
# 文件讀寫(xiě)異常處理
try:
f.write(output)
except PermissionError:
print('*****-無(wú)寫(xiě)入權(quán)限,請(qǐng)將文件夾賦予讀寫(xiě)權(quán)限-*****')
continue
else:
print('備份成功!')
# 連接異常處理
except exceptions.NetmikoAuthenticationException:
print('\n**********'+dev['host']+':登錄驗(yàn)證失敗!**********')
failed_ips.append(dev['host'])
continue
except exceptions.NetmikoTimeoutException:
print('\n**********'+dev['host']+':目標(biāo)不可達(dá)!**********')
failed_ips.append(dev['host'])
continue
except exceptions.ReadTimeout:
print('\n**********'+dev['host']+':讀取超時(shí),請(qǐng)檢查enable密碼是否正確!**********')
failed_ips.append(dev['host'])
continue
if len(failed_ips) > 0:
print('\n以下設(shè)備連接失敗,請(qǐng)檢查:')
for x in failed_ips:
print(x)
return 1
# 配置巡檢
def devices_autocheck(devices='', cmd=''):
# 存儲(chǔ)命令執(zhí)行回顯
results = []
try:
for x in range(len(devices)):
# 循環(huán)登錄設(shè)備
with ConnectHandler(**devices[x]) as conn:
conn.enable()
print('正在巡檢:'+devices[x]['host']+' ...')
result = [devices[x]['host'],devices[x]['device_type']]
for i in range(len(cmd)):
# 循環(huán)執(zhí)行命令,根據(jù)不同設(shè)備執(zhí)行不同命令
if 'cisco_ios' in devices[x]['device_type']:
output = conn.send_command(command_string=str(cmd[i]['cisco']))
elif 'huawei' or 'hp_comware' in devices[x]['device_type']:
conn.send_command(command_string='sys',expect_string=']')
output = conn.send_command(command_string=str(cmd[i]['huawei']))
result.append(output)
results.append(result)
except exceptions.NetmikoAuthenticationException:
print('\n**********'+devices[x]['host']+':登錄驗(yàn)證失敗!**********')
except exceptions.NetmikoTimeoutException:
print('\n**********' + devices[x]['host'] + ':目標(biāo)不可達(dá)!**********')
except exceptions.ReadTimeout:
print('\n**********' + devices[x]['host'] + ':讀取超時(shí),請(qǐng)檢查enable密碼是否正確!**********')
return results
# 計(jì)算內(nèi)存使用率
def get_mem(memstr,devtype=''):
if 'cisco' in devtype:
total_match = re.search(r'Processor Pool Total:\s+(\d+)', memstr)
used_match = re.search(r'Used:\s+(\d+)', memstr)
# 提取總數(shù)和已用數(shù),并將其轉(zhuǎn)換為整數(shù)
total = int(total_match.group(1))
used = int(used_match.group(1))
# 計(jì)算使用百分比
percentage = used / total * 100
return f"{percentage:.0f}%"
elif 'huawei' in devtype:
match = re.search(r"Memory Using Percentage Is:\s*(\d+)%", memstr)
if match:
memory_percentage = match.group(1)
return memory_percentage+'%'
else:
return "No match found."
# 獲取CPU利用率
def get_cpu(cpustr,devtype=''):
if 'cisco' in devtype:
pattern = r"CPU utilization for five seconds: (\d+)%"
match = re.search(pattern, cpustr)
if match:
cpu_utilization = match.group(1)
return cpu_utilization+'%'
else:
return "No match found."
elif 'huawei' in devtype:
match = re.search(r"\b(\d+(\.\d+)?)%.*?\bMax", cpustr)
if match:
cpu_utilization = match.group(1)
return cpu_utilization+'%'
else:
return "No match found."
# 運(yùn)行主程序
if __name__ == '__main__':
while True:
print("\n##############################################\n")
print("1:批量備份交換機(jī)配置")
print("2:批量巡檢交換機(jī)設(shè)備")
print("0:退出")
option = str(input("請(qǐng)輸入需要的操作編號(hào):"))
if option == '1':
dev = get_dev()
devices_confbak(devices=dev)
continue
elif option == '2':
# 定義巡檢命令
# cmds[x]['cisco']
# cmds[x]['huawei']
cmds = [
{'cisco':'show clock','huawei':'display clock'}, #檢查時(shí)鐘
{'cisco':'show env power','huawei':'display power'}, #檢查電源
{'cisco':'show env fan','huawei':'display fan'}, #檢查風(fēng)扇
{'cisco':'show env temperature status', 'huawei': 'display environment'},#檢查溫度
{'cisco':'show processes cpu', 'huawei': 'display cpu-usage'}, #檢查CPU利用率
{'cisco':'show processes memory', 'huawei': 'display memory-usage'}, #檢查內(nèi)存利用率
]
dev = get_dev()
checkres = devices_autocheck(dev,cmds)
for res in checkres:
# print(res)
print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
print(res[0]+'-巡檢結(jié)果:')
print('\n時(shí)鐘:\n'+res[2])
print('電源:\n'+res[3])
print('風(fēng)扇:\n'+res[4])
if 'Unrecognized command' in res[5]:
print('溫度:\n該設(shè)備不支持獲取此數(shù)據(jù)!')
else:print('溫度:\n'+res[5])
print('CPU利用率:\n' + get_cpu(res[6],res[1]))
print('內(nèi)存利用率:\n' + get_mem(res[7],res[1]))
print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
continue
elif option == '0':
break
else:
print("請(qǐng)輸入正確的編號(hào)!")到此這篇關(guān)于Python實(shí)現(xiàn)批量備份交換機(jī)配置+自動(dòng)巡檢的文章就介紹到這了,更多相關(guān)Python備份交換機(jī)和自動(dòng)巡檢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)挖掘之Apriori算法詳解和Python實(shí)現(xiàn)代碼分享
這篇文章主要介紹了數(shù)據(jù)挖掘之Apriori算法詳解和Python實(shí)現(xiàn)代碼分享,本文先是對(duì)Apriori算法做了詳細(xì)介紹,然后給出了Python版實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-11-11
Python Socket TCP雙端聊天功能實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Python Socket TCP雙端聊天功能實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
解決numpy和torch數(shù)據(jù)類型轉(zhuǎn)化的問(wèn)題
這篇文章主要介紹了解決numpy和torch數(shù)據(jù)類型轉(zhuǎn)化的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python 正則表達(dá)式 re . 符號(hào)示例詳解
(點(diǎn)號(hào)) 在默認(rèn)模式下,匹配除換行符以外的任意字符, 如果指定了 flags 參數(shù) DOTALL ,它將匹配包括換行符在內(nèi)的任意字符,下面通過(guò)示例代碼介紹Python 正則表達(dá)式 re . 符號(hào),感興趣的朋友跟隨小編一起看看吧2024-05-05
python正則匹配抓取豆瓣電影鏈接和評(píng)論代碼分享
抓取豆瓣各類型電影的鏈接和評(píng)論,按評(píng)分排列2013-12-12
Python使用Selenium模塊實(shí)現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能示例
這篇文章主要介紹了Python使用Selenium模塊實(shí)現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能,涉及Python基于re模塊的正則匹配及selenium模塊的頁(yè)面抓取等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

