目錄
最新代碼地址:https://gitee.com/feifei6779/python-net/blob/master/Excel/多線程查詢-3.py
2021-11-12 代碼,完成設備版本、開機時間的采集和輸出
import threading
import time
import os
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border, Side
from netmiko import ConnectHandler
import json
'''
多線程並發查詢華三交換version,並寫入同一表格內。
'''
os.chdir(os.path.dirname(__file__)) #將當前py文件路徑設置為工作路徑。
wb=Workbook()
def mkExcelFile(ip): # 首先創建一個新表格,返回表格名;
filetime=time.strftime('%Y-%m-%d_%H-%M-%S') #以開始時間作為表格文件名;
wb=Workbook()
ws=wb.active
font=Font(color='000000', bold=True, vertAlign=None, size=20)
ws['A1']=filetime+' 記錄巡檢輸出,表單名為設備的IP地址。'
ws['A1'].font=font
wb.save(filetime+'-'+ip+'.xlsx')
fileName=filetime+'-'+ip+'.xlsx'
return fileName
def getDevList(FilePath): # 獲取設備列表,輸入文件路徑,返回設備列表devList;
f=open(FilePath)
devList=[]
for line in f.readlines():
fLine=line.strip()
sw={
'device_type': fLine.split('---')[3],
'ip': fLine.split('---')[0],
'username': fLine.split('---')[1],
'password': fLine.split('---')[2]
}
devList.append(sw)
f.close
return devList
def GetVersionInfo(devList, ListAppend): # 定義實際要運行的函數,返回0;
command='disp version'
SW2={
'device_type': devList['device_type'],
'ip': devList['ip'],
'username': devList['username'],
'password': devList['password']
}
#使用netmiko連接設備:
connect = ConnectHandler(**SW2)
print('成功連接到設備 '+SW2['ip'])
version = connect.send_command(command, use_textfsm=True) #傳遞命令;
list1=json.loads(json.dumps(version, indent=2)) #將命令輸出的json字符串轉為python對象;
dict1=list1[0]
RList=[devList['ip']]
for item in dict1:
RList.append(dict1.get(item))
# RList.append(dict1.get('vrp_version'))
# RList.append(dict1.get('product_version'))
# RList.append(dict1.get('model'))
ListAppend.append(RList)
def VersionExcel(InfoList): #定義版本輸出表格,傳入設備信息列表;
ws=wb.create_sheet('Version',0)
list_title=['設備IP','設備版本','小版本','設備型號','本次運行時長','上次重啟原因']
ws.append(list_title)
for Rows in InfoList:
ws.append(Rows)
yellowFill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
RedRill = PatternFill(start_color='FF0000', end_color='9AFE2E', fill_type='solid')
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
for cells in ws[1]: #為第一行增加色彩填充;
cells.fill=yellowFill
for cell in ws['D']:
if 'up' in str(cell.value).lower(): #判斷單元格內容是否有“up”,如果有,就修改單元格樣式;
cell.fill=RedRill
for cell in ws['E']:
if '0 week' in str(cell.value).lower(): #判斷單元格內容是否有“0 week”,如果有,就修改單元格樣式;
cell.fill=RedRill
for row in ws.rows: #為所有單元格增加邊框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=18 #調整列寬;
ws.column_dimensions['B'].width=10
ws.column_dimensions['C'].width=14
ws.column_dimensions['D'].width=20
ws.column_dimensions['E'].width=40
ws.column_dimensions['F'].width=15
def MultiThread(DevFile): #定義多線程函數,輸入設備信息txt,輸出設備信息列表;
DevList=getDevList(DevFile)
VersList=[]
Threads=[]
for i in DevList:
t=threading.Thread(target=GetVersionInfo, args=(i, VersList))
t.start()
Threads.append(t)
for i in Threads:
i.join()
return VersList
# print(VersList)
'''
輸出為:
[['192.168.56.14', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.13', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 4 minutes', 'User reboot'],
['192.168.56.15', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.12', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.11', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 4 minutes', 'User reboot']]
'''
def main(DevFile, OutFile):
print('從文件 ' + DevFile + ' 中讀取設備信息,並嘗試連接。')
InfoList=MultiThread(DevFile) #使用多線程獲取設備信息;
print('表格信息寫入中。')
VersionExcel(InfoList) #使用單線程將設備信息寫入表格;
wb.save(OutFile)
print('表格信息寫入完成,名為:', OutFile)
if __name__=='__main__':
'''
第一個參數為設備地址和用戶等信息,第二個參數為要輸出的excel文件名:
'''
main('../ip_list.txt', 'test_Get_Version.xlsx')
輸出表格樣式為:
2021-11-13 代碼,改為字典傳遞命令和空列表,增加電源、風扇、cpu、內存的textfsm和信息獲取
代碼如下:
import threading
import time
import os
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border, Side
from netmiko import ConnectHandler
import json
'''
多線程並發查詢華三交換version,並寫入同一表格內。
0.2 加入電源和風扇的參數。
0.3 計划使用字典傳遞命令和存儲結果的列表清單。
'''
os.chdir(os.path.dirname(__file__)) #將當前py文件路徑設置為工作路徑。
wb=Workbook()
filetime=time.strftime('%Y-%m-%d_%H-%M-%S') #以開始時間作為表格文件名;
# 定義表格樣式:
yellowFill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
RedRill = PatternFill(start_color='FF0000', end_color='9AFE2E', fill_type='solid')
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
def getDevList(FilePath): # 獲取設備列表。輸入文件路徑,返回設備列表devList;
f=open(FilePath)
devList=[]
for line in f.readlines():
fLine=line.strip()
sw={
'device_type': fLine.split('---')[5],
'ip': fLine.split('---')[2],
'username': fLine.split('---')[3],
'password': fLine.split('---')[4],
'SNum': fLine.split('---')[0],
'DevName': fLine.split('---')[1]
}
devList.append(sw)
f.close
return devList
def GetDevInfo(devList, ComOutDict): # 巡檢獲取信息。傳遞設備列表,"命令:輸出"的字典;返回設備信息;
SW2={
'device_type': devList['device_type'],
'ip': devList['ip'],
'username': devList['username'],
'password': devList['password']
}
#使用netmiko連接設備:
connect = ConnectHandler(**SW2)
print('成功連接到設備 '+SW2['ip'])
for key in ComOutDict:
version = connect.send_command(key, use_textfsm=True) #從字典中獲取“命令”;
DevOutList=ComOutDict.get(key) #從字典中獲取存儲輸出的“列表”;
RList=[devList['SNum'], devList['DevName'], devList['ip']] #每設備初始列表增加“序號、設備名、IP”;
list1=json.loads(json.dumps(version, indent=2)) #將命令輸出的json字符串轉為python對象;
for dict in list1: #遍歷命令輸出,追加到列表中;
for item in dict:
RList.append(dict.get(item))
print(key,' : ',RList)
DevOutList.append(RList)
def VersionExcel(InfoList): #定義版本輸出表格。傳入設備信息列表;
ws=wb.active
ws.title='Version'
list_title=['序號','設備名','設備IP','設備版本','小版本','設備型號','本次運行時長','上次重啟原因']
ws.append(list_title)
for Rows in InfoList: #將信息寫入表格中;
ws.append(Rows)
for cells in ws[1]: #為第一行增加色彩填充;
cells.fill=yellowFill
for cell in ws['G']:
if '0 week' in str(cell.value).lower(): #判斷單元格內容是否有“0 week”,如果有,就修改單元格樣式;
cell.fill=RedRill
for row in ws.rows: #為所有單元格增加邊框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #調整列寬;
ws.column_dimensions['B'].width=25 #調整列寬;
ws.column_dimensions['C'].width=18 #調整列寬;
ws.column_dimensions['D'].width=10
ws.column_dimensions['E'].width=14
ws.column_dimensions['F'].width=20
ws.column_dimensions['G'].width=40
ws.column_dimensions['H'].width=15
def MultiThread(DevFile): #多線程函數,定義巡檢命令和保存設備輸出信息的列表。輸入設備信息txt,輸出設備信息列表;
DevList=getDevList(DevFile)
Threads=[]
VersList=[] #保存設備輸出信息的初始空列表;
PowerList=[]
FanList=[]
CpuList=[]
MemList=[]
ComOutDict={ #定義傳遞給巡檢函數的命令和列表;
'disp version':VersList,
'disp power':PowerList,
'disp fan':FanList,
'disp cpu':CpuList,
'disp memory':MemList,
}
for i in DevList:
t=threading.Thread(target=GetDevInfo, args=(i, ComOutDict))
t.start()
Threads.append(t)
for i in Threads:
i.join()
return VersList,PowerList,FanList,CpuList,MemList
# print(VersList)
'''
輸出為:
[['192.168.56.14', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.13', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 4 minutes', 'User reboot'],
['192.168.56.15', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.12', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 3 minutes', 'User reboot'],
['192.168.56.11', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 1 hour, 4 minutes', 'User reboot']]
'''
def main(DevFile, OutFile):
print('從文件 ' + DevFile + ' 中讀取設備信息,並嘗試連接。')
VersList,PowerList,FanList,CpuList,MemList=MultiThread(DevFile) #使用多線程獲取設備信息;
print('表格信息寫入中。')
VersionExcel(VersList) #使用單線程將設備信息寫入表格;
wb.save(OutFile)
print('表格信息寫入完成,名為:', OutFile)
print('PowerStatus:',PowerList,'\n\nFanStatus:',FanList,'\n\nCpuStatus:',CpuList,'\n\nMemStatus:',MemList,)
if __name__=='__main__':
'''
第一個參數為設備地址和用戶等信息,第二個參數為要輸出的excel文件名:
'''
main('../ip_list.txt', 'test_Get_Version211113.xlsx')
信息輸出如下:
從文件 ../ip_list.txt 中讀取設備信息,並嘗試連接。
成功連接到設備 192.168.56.12
成功連接到設備 192.168.56.11
成功連接到設備 192.168.56.14
成功連接到設備 192.168.56.15
成功連接到設備 192.168.56.13
disp version : ['2', 'DevName-2', '192.168.56.12', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 0 hours, 23 minutes', 'User reboot']
disp version : ['1', 'DevName-1', '192.168.56.11', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 0 hours, 23 minutes', 'User reboot']
disp version : ['4', 'DevName-4', '192.168.56.14', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 0 hours, 23 minutes', 'User reboot']
disp version : ['5', 'DevName-5', '192.168.56.15', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 0 hours, 23 minutes', 'User reboot']
disp version : ['3', 'DevName-3', '192.168.56.13', '7.1.075', 'Alpha 7571', 'S5820V2-54QS-GE', '0 weeks, 0 days, 0 hours, 23 minutes', 'User reboot']
disp power : ['1', 'DevName-1', '192.168.56.11', '1', 'Normal', '2', 'Normal']
disp power : ['4', 'DevName-4', '192.168.56.14', '1', 'Normal', '2', 'Normal']
disp power : ['2', 'DevName-2', '192.168.56.12', '1', 'Normal', '2', 'Normal']
disp power : ['5', 'DevName-5', '192.168.56.15', '1', 'Normal', '2', 'Normal']
disp power : ['3', 'DevName-3', '192.168.56.13', '1', 'Normal', '2', 'Normal']
disp fan : ['1', 'DevName-1', '192.168.56.11', '1', 'Normal', '2', 'Normal']
disp fan : ['2', 'DevName-2', '192.168.56.12', '1', 'Normal', '2', 'Normal']
disp fan : ['4', 'DevName-4', '192.168.56.14', '1', 'Normal', '2', 'Normal']
disp fan : ['5', 'DevName-5', '192.168.56.15', '1', 'Normal', '2', 'Normal']
disp fan : ['3', 'DevName-3', '192.168.56.13', '1', 'Normal', '2', 'Normal']
disp cpu : ['4', 'DevName-4', '192.168.56.14', '1', '0', '0', '0', '0']
disp cpu : ['2', 'DevName-2', '192.168.56.12', '1', '0', '1', '0', '0']
disp cpu : ['1', 'DevName-1', '192.168.56.11', '1', '0', '0', '0', '0']
disp cpu : ['5', 'DevName-5', '192.168.56.15', '1', '0', '0', '0', '0']
disp cpu : ['3', 'DevName-3', '192.168.56.13', '1', '0', '0', '0', '0']
disp memory : ['2', 'DevName-2', '192.168.56.12', '1', '512172', '305400', '40.4%']
disp memory : ['4', 'DevName-4', '192.168.56.14', '1', '512172', '296240', '42.2%']
disp memory : ['1', 'DevName-1', '192.168.56.11', '1', '512172', '294576', '42.6%']
disp memory : ['5', 'DevName-5', '192.168.56.15', '1', '512172', '296616', '42.1%']
disp memory : ['3', 'DevName-3', '192.168.56.13', '1', '512172', '299448', '41.6%']
表格信息寫入中。
表格信息寫入完成,名為: test_Get_Version211113.xlsx