前言:
本人在網絡行業有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進行更深一步的詳解,整體內容也會循序漸進,根據需求的遞進將簡單的代碼慢慢填充內容,個人感覺這樣更有利於學習,也是我的學習路徑。