銀狐NetDevOps-網絡運維Python初篇(三)openpyxl讀取excel信息,批量抓取設備配置

1、訓練場景:讀取excel大量設備信息,根據得到的信息進行批量操作

上一個章節我們舉了一個簡單的案例,利用netmiko抓取單臺思科設備的配置,現實情況我們不會對1臺設備進行操作,那樣的話就不需要自動化了。網上有很多教程,教大家用for循環讀取txt文檔內容,這種方式也確實可以。

不過有些企業有自己的CMDB系統,支持API調用或者excel導出,所以本章內容就以excel內容爲例,總歸類似的內容相對較少。

2、實驗環境:

操作系統:windows 10 PC機

python版本:python 3.8

網絡設備:華爲CE 6865

編輯器:vscode(pycharm、sublime均可,推薦vscode)

excel格式:初次使用簡單一些,excel中只加入IP地址

[圖片上傳失敗...(image-bed0b-1621266802456)]

3、思路分析

使用python第三方庫openpyxl讀取設備IP地址,並形成一個IP地址的list,這裏需要注意第一行是表頭,所以要從第二行開始讀取。拿到所有設備IP地址列表後進行for循環對每臺設備進行SSH連接(netmiko),然後發送CLI命令,並打印出來。

4、整體代碼

#!/usr/bin/env python
#coding: utf-8

from netmiko import ConnectHandler
from openpyxl import Workbook
from openpyxl import load_workbook

def read_device_excel( ):

    ip_list = []

    wb1 = load_workbook('/home/netops/venv/cs_lab.xlsx')
    ws1 = wb1.get_sheet_by_name("Sheet1")

    for cow_num in range(2,ws1.max_row+1):

        ipaddr = ws1["a"+str(cow_num)].value
        ip_list.append(ipaddr)

    return ip_list

def get_config(ip_list):

    for ipaddr in ip_list:

        session = ConnectHandler(device_type="huawei",
                                ip=ipaddr,
                                username="dev_user",
                                password="dev_password",
                                banner_timeout=300)

        print("connecting to "+ ipaddr)
        print ("---- Getting HUAWEI configuration from {}-----------".format(ipaddr))

        config_data = session.send_command('dis ip int brief ')

        print (config_data)
        session.disconnect()

def main():
    ip_list = read_device_excel()
    get_config(ip_list)

#-------------------------------------------------------    
if __name__ == '__main__':
    main()

執行結果:

5、代碼詳解

#!/usr/bin/env python
#coding: utf-8

from netmiko import ConnectHandler
from openpyxl import Workbook
from openpyxl import load_workbook

導入netmiko和openpyxl模塊就不多說了,大家都懂。

def read_device_excel( ):

    ip_list = []

    wb1 = load_workbook('/home/netops/venv/cs_lab.xlsx')
    ws1 = wb1.get_sheet_by_name("Sheet1")

1、創建read_device_excel函數,因爲我們需要一個IP地址的列表,所以先創建一個空list。

2、調用openpyxl穿件workbook對象,用於創建workbook並複製給wb1,workbook1內的sheet1賦值給ws1(Sheet1也是默認sheet)。

    for cow_num in range(2,ws1.max_row+1):

        ipaddr = ws1["a"+str(cow_num)].value
        ip_list.append(ipaddr)

    return ip_list

3、A列第一行可以用A1表示,A1的value屬性就是單元格里的內容,比如A1=IP,A2=10.23.80.93,現在我們想遍歷出所有IP地址,就要用for循環遍歷A列所有內容,這裏要注意,第一行我們是不需要的,所以我們真正要遍歷的是2-5行,可以使用ws1.max_row得到最大值,這裏max_row =5,range的(2,5)其實=2,3,4,這樣最後一行就抓不到了,所以要max_row+1,確保第一行所有IP都能抓到。

4、最後把ip列表retrun出來(傳遞出來)

def get_config(ip_list):

    for ipaddr in ip_list:

        session = ConnectHandler(device_type="huawei",
                                ip=ipaddr,
                                username="dev_user",
                                password="dev_password",
                                banner_timeout=300)

        print("connecting to "+ ipaddr)
        print ("---- Getting HUAWEI configuration from {}-----------".format(ipaddr))

        config_data = session.send_command('dis ip int brief ')

        print (config_data)
        session.disconnect()

5、創建一個get_config的函數,並把上面的ip_list傳遞進來進行for循環。

6、針對沒一個IP地址進行SSH登錄,並用print提示我們正在登錄哪個設備。

7、直接使用send_command方法發送CLI命令。

8、打印交換機返回的結果,並關閉session。

def main():
    ip_list = read_device_excel()
    get_config(ip_list)

#-------------------------------------------------------    
if __name__ == '__main__':
    main()

爲了代碼更加清晰,創建了1個主函數main(),並分別調用讀取excel函數和getconfig函數。

*SSH也可以單獨寫成一個函數,get_config內部調用SSH函數,這種方式更靈活。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章