網路工程師的Python學習筆記+乾貨

3.26 -- 更新實驗2,增加視頻演示

3.28 -- 更新實驗3


有幾個月沒有寫專欄文章了,因為筆者閉關了兩個月學Python去了,廢話不多說,進入正題。

隨著這幾年SDN等網路自動化技術的興起,以Python為主的編程能力對傳統網路工程師來說已經成為了一項高需求,甚至是必備的技能了。換句話來說,那些不具備編程能力,在工作中只會使用CLI或者GUI來操控網路設備的網工,不管是現在還是將來,他們在行業里的競爭力只會是只減不增的,這是大勢所趨,不可避免的。筆者今年1月份面試了一份新加坡對沖基金公司(行業TOP3)的高薪Network Architect職位(年薪90萬+RMB),在該職位的Job Description中就明確提出了Python,JAVA, TCL這些編程能力是strongly preferred的技能,後來筆者拿到了offer,但是因為薪水沒談攏,最終筆者並沒返回新加坡,而是繼續留在沙特阿卜杜拉國王科技大學(KAUST)工作。

新加坡某對沖基金公司(行業TOP3)的Network Architect職位JD

筆者從業9年,換了很多份工作,比較熟識的同事和同行不下60個。筆者沒有在國內工作過,對國內的行業情況不甚了解,但是以筆者在新加坡工作7年,沙特2年的經驗來看,目前我認識的具備了能將Python熟練使用在網路運維中這項能力的同行60個人中不超過3個,而這3位清一色的都是在知名的Tier 1運營商里工作,大型企業網和SME(中小型公司)中筆者還沒見到會使用Python的同事和同行。可見這項技能在計算機網路這個行業里還遠沒達到「爛大街"的地步,至少在國外是如此,也因此給的起錢的金融業公司願意高薪聘請會Python的網路工程師,物以稀為貴嘛。

筆者2014年用Mininet來學習和嘗試SDN時曾短暫接觸過Python,當時學了些皮毛,沒有深入。在1月份的這次面試後,筆者下定決心重拾Python,目的有兩個:1. 希望已過而立之年的自己在行業里依然保持足夠的競爭力,能夠邁過即將到來的職場中年危機。2. 筆者目前所任職的沙特國王科技大學校園網路相當龐大,3000多台的接入層交換機(均為思科Catalyst,2960/3560/3750/3850/9300都有)管理起來工作量是相當大的,雖然我們已經部署了Solarwinds Orion這個網路管理系統,但是這種第三方NMS軟體是有技術壁壘的,出了問題要找廠商的TAC幫助排錯,效率低下不說,還會受到運行這個NMS的伺服器本身性能的影響,另外如果你將來換了工作,你能確保下一家公司使用的是同樣的NMS嗎?而反觀Python則沒有上述的顧慮。

這篇文章是筆者這兩個月來自學Python的一些筆記和心得,外加一些在網路運用中的實戰配置和代碼。網上關於Python的入門教程多如牛毛,筆者就不浪費篇幅詳細地講解Python的基礎知識了,筆者將給出一些自認重要的知識點,配合代碼實戰講解。筆者目前仍然在堅持自學Python,本篇文章也將不定時持續更新,鑒於筆者本身也只是初學者,本著拋磚引玉的態度,如有不足之處,還望諸君不吝賜教、指正。


Python實驗運行環境:

操作系統:Windows 8.1上跑CentOS 7(VMware虛擬機)

*筆者最早接觸的LINUX版本就是CentOS,對比較熱門的Ubuntu, Debian等並不熟,不同版本的LINUX有一些基本命令不一樣,比如yum install和apt-get的區別,但這並不影響我們學習Python,如果讀者對Linux不熟,希望你能花點時間學習下touch, chmod, cat, ls等等這些最基礎的命令,以及掌握vim或者nano這些編輯文檔的程序。

網路設備:GNS3運行的思科三層交換機

網路設備版本:思科IOS (vios_12-ADVENTERPRISEK9-M)

Python編輯器: Sublime Text 3.0 (很不錯的編輯器,有朋友介紹Pycharm,還沒來得及試用)

Python版本:2.7.5

**這裡解釋下為什麼不用最新的Python 3: Python 3.x是最新的Python版本,將來終會淘汰Python 2成為最主流的版本。但是目前很多和計算機網路有關的模塊比如Scapy, Trigger, easySNMP等在Python 3中並沒得到很好的支持,就目前的趨勢來看,離Python 3徹底淘汰Python 2至少還有10年的時間,而且2和3的區別雖然有,但是如果你徹底掌握了2的話,只需要一兩天就能將3懂個80%,因此目前我們完全可以從2開始學起,另外2.7.5算是比較舊的版本,但是對初學者來說完全夠用了。

網路實驗拓撲:

區域網IP地址段:192.168.2.0 /24

運行Python的客戶端: 192.168.2.1

Layer3Switch-1: 192.168.2.11

Layer3Switch-2: 192.168.2.12

Layer3Switch-3: 192.168.2.13

Layer3Switch-4: 192.168.2.14

Layer3Switch-5: 192.168.2.15

所有的交換機已經預配好了SSH,用戶名: python 密碼:123

網路實驗拓撲

  • 要讓Python通過SSH遠程登陸網路設備,主要有Paramiko和Netmiko兩種模塊可以使用(telnet的話需要使用telnetlib模塊,但是鑒於telnet的安全性,不建議使用,關於telnet的應用以後有機會再講)。Paramiko和Netmiko的區別在於後者是前者的命令簡化版本,且支持多廠商設備,但是筆者本人更偏愛Paramiko,因此代碼里將使用Paramiko來SSH登陸設備。
  • Paramiko並不是Python自帶的package,我們必須下載並安裝Paramiko,要安裝Paramiko,首先要安裝pip(yum install不支持), pip的作用是用來安裝和管理Python pacakges的,在CentOS中安裝Paramiko的步驟如下(因為是單純的實驗環境,我是直接用的root賬戶):

A. 先安裝pip

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"python get-pip.py

在CentOS 7里安裝pip

B. 安裝好pip後,接著安裝paramiko

pip install paramiko

用pip安裝Paramiko

C. 安裝好Paramiko後,打開Python測試是否可以使用import paramiko來引用它,如果沒報錯,則說明安裝成功。

測試Paramiko是否安裝成功


實驗1:

實驗目的:

  1. 用Python實現SSH登陸單個交換機(192.168.2.11),為其loop0埠配置1.1.1.1 /32這個IP。
  2. 因為是第一個實驗,為求最簡單,最直觀的代碼,這裡我們在代碼里預設IP,username, password,不使用raw_input()函數和getpass模塊。
  • 運行代碼前,首先確認S1上的配置,此時S1上的loop0埠並沒有IP

執行代碼前S1配置

  • 在CentOS上創建一個名為lab1.py的文件,將其改為可執行(否則等會兒你無法運行該script文件),然後用vim打開該文件,然後放入下列代碼

#!/usr/bin/env pythonimport paramikoimport timeip = "192.168.2.11"username = "python"password = "123"ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password)print "Sucessfully login to ", ipcommand = ssh_client.invoke_shell()command.send("configure terminal
")command.send("int loop 0
")command.send("ip address 1.1.1.1 255.255.255.255
")command.send("end
")command.send("wr mem
")time.sleep(1)output = command.recv(65535)print outputssh_client.close

實驗1代碼部分講解:

  • 除了Paramiko外,我們還import了time這個Python自帶的模塊,它的作用後面會講到
  • ip, username, password這三個變數很直接明了,只需注意它們的類型必須是string(字元串)。
  • sshclient = paramiko.SSHClient(), 調用paramiko的SSHClient()方法將其assign給ssh_client這個變數。顧名思義,這裡我們的CentOS主機是做SSH client,而SSH server則是我們要登陸的S1交換機(192.168.2.11)。
  • 默認情況下,Paramiko會拒絕任何未知的SSH public keys,這裡我們使用ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 來讓Paramiko接受來自SSH Server端(也就是S1)提供的public key。
  • ssh_client.connect(hostname=ip,username=username,password=password),很好理解,調用Paramiko的connect()函數,使用我們預設好的ip, username, password來登陸S1。
  • 如果登陸成功,用print "Sucessfully login to ", ip來提示用戶登錄成功,並顯示所登陸的交換機的ip地址,這裡為192.168.2.11
  • command = ssh_client.invokeshell(),調用paramiko的invoke_shell()方法,將其assign給command這個變數。
  • 現在可以讓command配合send()這個函數來對交換機發號施令了,後面的命令就不講了,這些對網工來說應該是整個script裡面最熟悉的部分了。
  • time.sleep(1),前面提到了我們import了time這個模塊。有時候系統運行script時會有延遲,它的作用是讓系統稍侯1秒鐘,再執行下面的語句。
  • output = command.recv(65535),python截屏本次運行script後的所有輸出記錄,將其assign給output這個變數。
  • print output, 再將output列印出來,這樣你在運行python的過程中就能清楚看到python sciprt對你的交換機做了些什麼。
  • ssh_client.close,最後記得養成好習慣,退出SSH。

下面運行這段代碼,看看效果:

代碼執行效果

運行成功!Python成功登錄了192.168.2.11,幫我們執行了要配置的命令,現在再登錄S1,看看變化, S1的loop 0埠已經成功配置了1.1.1.1 /32這個IP。

代碼執行後S1配置


實驗2:

實驗目的:

  1. 配合getpass模塊和raw_input()函數實現互動式的SSH用戶名和密碼輸入。
  2. 配合for loop同時給5台交換機配置VLAN 10至VLAN 20。
  • 運行代碼前,首先確認5台交換機上的配置,確認它們都沒有VLAN 10至VLAN 20。

執行代碼前S1配置

執行代碼前S2配置

執行代碼前S3配置

執行代碼前S4配置

執行代碼前S5配置

  • 在CentOS上創建一個名為lab2.py的文件,將其改為可執行,然後用vim打開該文件,然後放入下列代碼

#!/usr/bin/env pythonimport paramikoimport timeimport getpassusername = raw_input(Username: )password = getpass.getpass(Password: )for i in range(11,16): ip = "192.168.2." + str(i) ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print "Successfully connect to ", ip command = ssh_client.invoke_shell() command.send("configure terminal
") for n in range (10,21): print "Creating VLAN " + str(n) command.send("vlan " + str(n) + "
") command.send("name Python_VLAN " + str(n) + "
") time.sleep(0.5) command.send("end
") command.send("wr mem
") time.sleep(2) output = command.recv(65535) print outputssh_client.close

實驗2代碼部分講解:

  • 這裡import了getpass這個模塊,用來提示用戶輸入密碼。它和raw_input()函數一樣,都是python的互動式功能,區別是,如果用rawinput()來提示輸入密碼的話,用戶輸入的密碼是明文可見的,如果你身邊坐了他人,密碼就這麼暴露了。而getpass輸入密碼時,則是不可見的,安全性很高,所以強烈建議使用getpass來輸入密碼,使用raw_input()來輸入用戶名
  • 由於這裡S1-S5五個交換機的ip是連續的,192.168.2.11 - 15, 這樣我們可以配合for i in range(11,16)做一個簡單的for loop,然後以此配合下一行代碼ip = "192.168.2." + str(i)來實現循環(批量)登錄交換機S1至S5。注意:這裡的i是整數,整數不能和字元串相「+」,所以要用str(i)先將i轉化成字元串。
  • for n in range (10,21): 同樣的道理,我們要創建VLAN 10 至 VLAN 20,VLAN id是連續的,所以這裡又可以配合一個簡單的for loop達到循環配置VLAN10 - 20。

執行代碼來看效果

https://www.zhihu.com/video/961647841458032640

最後登陸所有交換機一一驗證,檢查代碼是否創建了VLAN 10 至 20

https://www.zhihu.com/video/961648913980227584


實驗3:

實驗目的:

  1. 在生產環境中,交換機的管理ip地址基本不可能像實驗環境中這樣11到15連續的,有些交換機的管理ip甚至在不同的網段,這種情況下,我們就不能簡單的用for loop來循環ip地址的最後一段來登錄交換機了。這裡我們要額外開一個文本文件,把我們需要登錄的交換機ip全部寫進去,然後用for loop配合open()函數來批量登錄所有交換機。
  2. 用上面的方法登錄所有交換機,開啟EIGRP .

開始實驗3前,我們需要做兩個準備:

  1. 把S5的管理地址從192.168.2.15改成192.168.2.55
  2. 創建一個名為ip_list.txt的文件,把S1,S2,S3,S4,S5交換機的管理IP地址放進去

把S5的地址改為192.168.2.55

創建一個ip_list.txt文件,把所有交換機的管理IP放進去

準備就緒後,老規矩創建lab3.py,把它改成可執行,然後放入下列代碼

#!/usr/bin/env pythonimport paramikoimport timeimport getpassusername = raw_input(Username: )password = getpass.getpass(password: )f = open("ip_list.txt","r")for line in f: ip = line.strip() ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print "Successfully connect to ", ip remote_connection = ssh_client.invoke_shell() remote_connection.send("conf t
") remote_connection.send("router eigrp 1
") remote_connection.send("end
") remote_connection.send("wr mem
") time.sleep(1) output = remote_connection.recv(65535) print outputf.close()ssh_client.close

實驗3代碼部分講解:

  • open("ip_list.txt", "r")來打開我們實驗前創建好了的ip_list.txt這個保存所有交換機管理地址的文檔,後面的"r"表示只讀,可寫可不寫,因為默認就是它。
  • for line in f: 用for loop讀取ip_list.txt文檔里的每一行內容,每一行都是交換機的管理地址。
  • ip = line.strip(),用strip()去掉多於的空格然後把結果assign給ip這個變數。
  • f.close(), 文件有開有關,養成好習慣,用完後記得關閉。也可以用with as的語句來寫,這樣不需要用close()來關閉已打開的文件,這個看個人喜好,初學者用簡單的 f = open(),f.close()就夠用了。

老規矩,執行代碼前登陸所有交換機,確認目前沒有EIGRP開啟:

執行實驗3代碼前S1配置

執行實驗3代碼前S2配置

執行實驗3代碼前S3配置

執行實驗3代碼前S4配置

執行實驗3代碼前S5配置

一切就緒後,執行代碼看效果:

https://www.zhihu.com/video/962438454973579264

最後登陸所有交換機一一驗證EIGRP是否已經開啟:

https://www.zhihu.com/video/962439460798066688

實驗3就講到這裡,未完待續

推薦閱讀:

有哪些市場飽和度低、潛力較大的藍海行業還未被發覺?
360雲盤宣布關閉,你怎麼看?
遇到小人,怎麼辦?
有什麼適合互聯網設計師的Coursera課程
高調押寶屏下指紋的vivo,準備好應對即將到來的輿論漩渦了嗎?

TAG:互聯網 | 信息技術IT | 編程 |