銀狐NetDevOps-網絡運維Python初篇(一)Netmiko抓取設備配置

前言:

本人在網絡行業有8年以上工作經驗,CCIE塊10年了,HCIE也5年了,目前就職於國內某知名互聯網公司。大型國企和大型互聯網公司都擁有一定的運維經驗,也能體會到相互之間的需求差異。對於前幾年大熱的SDN網絡、NetDevOps自動化運維都有真實的實戰經驗,對於行業內的尷尬處境還是有一些自己的感悟。

網絡工程師大部分編程能力較弱,這個事情2年前就是如此,也有很多同行指出了這個問題。但是2年後的今天(2020年11月份)依然如此,接觸到的就算是國內互聯網TOP大廠和頭部通信廠商的同事,擁有一定編程能力的還是佔少數。但是,隨着企業基礎設施逐漸增多,就算不談互聯網巨頭,中型企業也有成百上千的硬件設備,沒有編程能力的網工很難勝任未來的工作。

目前來看最適合網工優先學習的還是python這門語言,雖然自動化神器ansible這個工具也能用一用,但是很多廠商設備並不支持ansible,而且工具畢竟沒有語言靈活,數據中心內如果是大量H3C、銳捷、山石這些自動化能力比較滯後的廠商,只會ansible這種工具的可能就瘋掉了。

相信大家都有一樣的痛點,想要學習python這門編程語言並運用到工作中,結果發現網上python教學資料很多,和網絡運維相關的寥寥無幾。雖然近幾年搞傳統網絡培訓的也開始做python方面課程,整個課程90%的內容還是把NetDevOps知識點給你過一遍,最後10%內容給你找幾個簡單案例。學過以後你會發現很難應用到自己的企業,因爲這些培訓機構的老師其實沒有互聯網公司的實戰經驗,很多場景是想象不出來的。

所以,我希望可以通過分享我微不足道的學習過程和實戰經驗,幫助更多想要學習python提升工作效率和核心競爭力,想要踏上NetDevOps道路的人。另一方面也是爲了可以找到更多同行之人,大家一起努力讓這個行業不在那麼尷尬,當更多的人都具備自動化運維能力,整個行業應該也會有所不同。

因爲網上教python基礎的內容有很多,所以文章就不多闡述基礎內容了,數據結構、算法、進程線程協程、面向對象之類的B站、百度等都有大把資料。當然,筆者在編程方面也是初學者,內容如果有錯誤或者有不足的地方,還請各位同行指正。


1、訓練場景:Netmiko單線程抓取1臺網絡設備配置

第一個場景比較簡單,也不涉及批量操作,主要是先熟悉一下如何用python來模擬我們平時的人爲操作。

這裏有幾個步驟:

導入合適的python第三方模塊,抓取網絡設備配置一般的邏輯就是python腳本調用第三方SSH庫,然後通過SSH遠程登錄到設備上,輸入CLI命令(show run),並將配置內容打印出來。

常見的SSH第三方庫有pexpect、paramiko、netmiko,paramiko屬於給系統運維使用的,針對主機層面的跑批模塊,對於網絡設備不太友好,而netmiko是在paramiko的基礎上改造的,屬於專爲網絡運維打造的模塊,除非有些常識設備不支持netmiko,那我們只能用其他的了,正常情況下還是推薦直接使用netmiko模塊,不用太關心其他模塊。(幫助大家降低學則成本)

2、實驗環境:

操作系統:windows 10 PC機

python版本:python 3.8

網絡設備:EVE-NG模擬器(3700 Software (C3725-ADVENTERPRISEK9-M), Version 12.4(15)T14)

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

3、本章節整體代碼(可複製粘貼直接使用)

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from netmiko import ConnectHandler                                #導入netmiko模塊

session = ConnectHandler(device_type = "cisco_ios",               #創建SSH連接,並填入相關信息
                        ip = "192.168.147.146",
                        username = "root",
                        password = "root@123",
                        port = 22,
                        verbose = True
                        )

print("connected to 192.168.147.146")                             #打印連接成功提示

config = session.send_command("show running-config")              #抓取配置引入config

print(config)                                                     #回顯內容,類似登錄設備show run

session.disconnect()                                              #關閉SSH Session

以下爲執行程序後的回顯內容,其實就和我們人工SSH登錄設備show run結果一樣

4、代碼分段詳解

頭部常用代碼

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

前兩行不用深入理解,複製粘貼就好,

第一行是爲了告訴操作系統執行這個腳本的時候,調用哪個路徑的解釋器。一般有兩種寫法:

1、#!/usr/bin/python

2、#!/usr/bin/env python

第二種方式兼容虛擬環境,推薦使用。(虛擬環境以後再說)

第二行是編碼問題,python3默認支持中文,可以沒有,python2默認不支持中文,必須有,所以我只是習慣性的加上。

以上不是本章重點,暫時不用關注太多。

netmiko 創建SSH代碼

from netmiko import ConnectHandler                                #導入netmiko模塊,2種方法下面詳解

#創建SSH連接,並填入相關信息
session = ConnectHandler(device_type = "cisco_ios",               #device_type在下面詳解
                        ip = "192.168.147.146",                   #設備管理地址
                        username = "root",                        #SSH用戶名
                        password = "root@123",                    #SSH密碼
                        port = 22,                                #SSH端口,默認22,可以不寫
                        verbose = True                            #允許在標準輸出中添加附加信息,可以不寫
                        )

導入Netmiko模塊,並創建SSH連接,

常用的導入模塊有2種方式:

import netmiko

這種方式就是把整個netmiko模塊導入(包含各種對象和函數),但是在調用的時候需要加上模塊名稱,比如上面的代碼就需要改爲:

import netmiko

session = netmiko.ConnectHandler(device_type = "cisco_ios",               #創建SSH連接,並填入相關信息
                        ip = "192.168.147.146",
                        username = "root",
                        password = "root@123",
                        port = 22,
                        verbose = True
                        )

我使用的是第二種導入方式:

from netmiko import ConnectHandler
from 模塊名 import 函數名

這樣就可以使用函數。

爲了不讓大家回滾到上面,再次複製一次netmiko代碼

from netmiko import ConnectHandler                                #導入netmiko模塊,2種方法下面詳解

#創建SSH連接,並填入相關信息
session = ConnectHandler(device_type = "cisco_ios",               #device_type在下面詳解
                        ip = "192.168.147.146",                   #設備管理地址
                        username = "root",                        #SSH用戶名
                        password = "root@123",                    #SSH密碼
                        port = 22,                                #SSH端口,默認22,可以不寫
                        verbose = True                            #允許在標準輸出中添加附加信息,可以不寫
                        )

這時我們需要讓PC電腦通過netmiko遠程SSH到網絡設備,創建一個session,

所以我們直接使用ConnectHandler函數,裏面有幾個參數需要注意,

device_type(字符串str):就是設備類型,其實就是讓netmiko知道你要連接什麼廠商什麼類型的設備,

官網可以找到支持什麼廠商、什麼系統,常見的思科、華爲、Juniper、H3C、F5、A10等都支持,系統也比較全面,比如思科:Cisco IOS-XE,Cisco IOS-XR,Cisco ASA,Cisco NX-OS等,華爲的CE系統等,有興趣的可以看下官方資料。

常用的device_type:

思科:ciscoios,cisco_nxos

華爲:huawei(CE系列交換機)

H3C:hp_comware(這個注意下,很多人不知道)

juniper:juniper_junos

print("connected to 192.168.147.146")                             #打印連接成功提示

config= session.send_command("show running-config")              #抓取配置引入config

print(config)                                                     #回顯內容,類似登錄設備show run

session.disconnect()                                              #關閉SSH Session

第一個print信息其實是爲了給我們一個提示,表示netmiko模塊的ConnectHandler函數執行成功,所以下一行代碼纔會執行。

已經建立好session後,調用send_command向設備發送CLI命令(字符串形式),並將返回的結果引入config中,最後將config結果打印出來,當然也不能忘了中斷SSH Session。

##################################################

注意:

除了send_command以外還有很多方法,以後我們會慢慢用到。

  • session.send_command() # 僅向設備發送一條字符串命令,通常使用show/display、save命令等單一操作使用,使用後會等待回顯。
  • session.send_command_timing() # 和send_command類似,區別是收到回顯不會直接結束函數,而是有個等待時間,針對某些大量回顯內容的場景可使用。
  • session.send_config_set() # 發送配置命令,該函數屬於已在特權模式下,所以可直接發送配置命令,無需輸入system-view、config terminal之類的命令,一般搭配list使用。
  • session.send_config_from_file() # 發送從文件加載的配置命令,推薦使用大量配置輸入時。
  • session.save_config() # 保存配置
  • session.enable() # 輸入啓用模式
  • session.find_prompt() # 返回當前路由器提示符
  • session.commit() # 提交配置(華爲和juniper適用)

第一篇文章只是一個開端,沒有過多的python內容,也沒講解太多模塊細則,主要還是先做一個開始,讓大家有一個體會。下一章節會對netmiko進行更深一步的詳解,整體內容也會循序漸進,根據需求的遞進將簡單的代碼慢慢填充內容,個人感覺這樣更有利於學習,也是我的學習路徑。

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