python netmiko 多線程巡檢腳本




最新代碼地址: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM