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函數,這種方式更靈活。