網絡工程領域不斷出現新的協議、技術、交付和運維模式。傳統網絡面臨著云計算、人工智能等新連接需求的挑戰。企業也在不斷追求業務的敏捷、靈活和彈性。在這些背景下,網絡自動化變得越來越重要。
網絡編程與自動化旨在簡化工程師網絡配置、管理、監控和操作等相關工作,提高工程師部署和運維效率。本課程定位于指導網絡工程師初步了解Python/ target=_blank class=infotextkey>Python編程實現網絡自動化
背景:傳統網絡運維困境
傳統的網絡運維工作需要網絡工程師手動登錄網絡設備,人工查看和執行配置命令,肉眼篩選配置結果。這種嚴重依賴“人”的工作方式操作流程長,效率低下,而且操作過程不易審計。

經典運維場景
在工作中你是否遇到過這樣的場景:
1.設備升級:現網有數千臺網絡設備,你需要周期性、批量性地對設備進行升級。
2.配置審計:企業年度需要對設備進行配置審計。例如要求所有設備開啟sTe.NET功能,以太網交換機配置生成樹安全功能。你需要快速地找出不符合要求的設備。
3.配置變更:因為網絡安全要求,需要每三個月修改設備賬號和密碼。你需要在數千臺網絡設備上刪除原有賬號并新建賬號。
網絡自動化
網絡自動化,通過工具實現網絡自動化地部署、運行和運維,逐步減少對“人”的依賴。這能夠很好地解決傳統網絡運維的問題。
業界有很多實現網絡自動化的開源工具,例如Ansible、SaltStack、Puppet、Chef等。從網絡工程能力構建的角度考慮,更推薦工程師具備代碼編程能力。

基于編程實現的網絡自動化
近幾年隨著網絡自動化技術的興起,以Python為主的編程能力成為了網絡工程師的新技能要求。
Python編寫的自動化腳本能夠很好的執行重復、耗時、有規則的操作。

舉例:Python實現設備自動化配置
網絡自動化能做什么?最直觀的一個網絡自動化例子就是自動化配置設備。我們可以把這個過程分為兩個步驟:編寫配置文件和編寫Python代碼將配置文件推送到設備上。
首先用命令行方式寫配置腳本,然后通過Telnet/SSH將它傳到設備上運行。這種方式對于初學網絡編程與自動化的網絡工程師來說,比較容易理解。本章節主要介紹這種方式實現網絡自動化。
編程語言
編程語言(Programming Language),是一種用于編寫計算機程序的語言,用于控制計算機的行為。
按照語言在執行之前是否需要編譯區分,可以將編程語言分為需要編譯的編譯型語言(Compiled Language),不需要編譯的解釋型語言(Interpreted Language) 。

計算技術棧與程序執行過程

高級編程語言 - 編譯型語言
編譯型語言:編譯型語言的程序在執行之前有一個編譯過程,把程序編譯成為機器語言的文件。運行時不需要重新翻譯,直接使用編譯的結果。典型的如C/C++/Go語言,都屬于編譯型語言。
從源碼到程序的過程:源碼需要由編譯器、匯編器翻譯成機器指令,再通過鏈接器鏈接庫函數生成機器語言程序。機器語言必須與CPU的指令集匹配,在運行時通過加載器加載到內存,由CPU執行指令。

高級編程語言 - 解釋型語言
解釋型語言:解釋型語言的程序不需要在運行前編譯,在運行程序的時候才逐行翻譯。典型的如JAVA/Python語言,都屬于解釋型語言。
從源碼到程序的過程:解釋型語言的源代碼由編譯器生成字節碼,然后再由虛擬機(JVM/PVM)解釋執行。虛擬機將不同CPU指令集的差異屏蔽,因此解釋型語言的可移植性相對較好。

什么是Python?
Python是一門完全開源的高級編程語言。它的作者是Guido Van Rossum。
Python的優點:
•Python擁有優雅的語法、動態類型具有解釋性質。能夠讓學習者從語法細節的學習中抽離,專注于程序邏輯。
•Python同時支持面向過程和面向對象的編程。
•Python擁有豐富的第三方庫。
Python可以調用其他語言所寫的代碼,又被稱為膠水語言。
Python的缺點:
•運行速度慢。Python是解釋型語言,不需要編譯即可運行。代碼在運行時會逐行地翻譯成CPU能理解的機器碼,這個翻譯過程非常耗時。
由于Python具有非常豐富的第三方庫,加上Python語言本身的優點,所以Python可以在非常多的領域內使用:人工智能、數據科學、App、自動化運維腳本等。
Python代碼執行過程

Python程序編譯運行的過程Python程序編譯運行的過程
操作過程:
1、在操作系統上安裝Python和運行環境。
2、編寫Python源碼。
3、編譯器運行Python源碼,編譯生成pyc文件(字節碼)。
4、Python虛擬機將字節碼轉換為機器語言。
5、硬件執行機器語言。
初識Python代碼 - 交互式運行
Python有兩種運行方式,交互式運行和腳本式運行。
交互式編程不需要創建腳本文件,是通過 Python 解釋器的交互模式編寫代碼。

代碼塊:
C:UsersRichard>python
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("hello world")
hello world
>>> a = 1
>>> b = 2
>>> print ( a + b )
3
>>>
初識Python代碼 - 腳本式運行
腳本模式里的代碼可以在各種Python編譯器或者集成開發環境上運行。例如Python自帶的IDLE、Atom、Visual Studio、Pycharm和Anaconda等。

Python編碼規范
編碼規范是使用Python編寫代碼時應遵守的命名規則、代碼縮進、代碼和語句分割方式等。良好的編碼規范有助于提高代碼的可讀性,便于代碼的維護和修改。
例如分號、圓括號、空行和空格的使用規范建議如下:

Python編碼規范 - 標識符命名
Python標識符用于表示常量、變量、函數以及其他對象的名稱。
標識符通常由字母、數字和下劃線組成,但不能以數字開頭。標識符大小寫敏感,不允許重名。如果標識符不符合規則,編譯器運行代碼時會輸出SyntaxError語法錯誤。

備注:
•Python最基本的數據類型有布爾型(True/False)、整數、浮點型、字符串型。Python里的所有數據(布爾值、整數、浮點、字符串,甚至大型數據結構、函數以及程序)都是以對象(object)的形式存在的。這使得Python語言有很強的統一性。
•運行結果分別為10,20,Richard,2,SyntaxError(語法錯誤)。
•本文不對Python語法做針對介紹,更多Python語法請參考HCIP課程。
Python編碼規范 - 代碼縮進
在Python程序中,代碼縮進代表代碼塊的作用域。如果一個代碼塊包含兩個或更多的語句,則這些語句必須具有相同的縮進量。對于Python而言代碼縮進是一種語法規則,它使用代碼縮進和冒號來區分代碼之間的層次。
編寫代碼時候,建議使用4個空格來生成縮進。如果程序代碼中使用了錯誤的縮進,則會在運行中發出IndentationError錯誤信息。

Python編碼規范 - 使用注釋
•注釋就是在程序中添加解釋說明,能夠增強程序的可讀性。在Python程序中,注釋分為單行注釋和多行注釋。
•單行注釋以 # 字符開始直到行尾結束。
•多行注釋內容可以包含多行,這些內容包含在一對三引號內(’’’…’’’或者”””…”””)。

Python編碼規范 - 源碼文件結構
一個完整的Python源碼文件一般包含幾個組成部分:解釋器和編碼格式聲明、文檔字符串、模塊導入和運行代碼。
如果會在程序中調用標準庫或其他第三方庫的類時,需要先使用import或from… import語句導入相關的模塊。導入語句始終在文件的頂部。在模塊注釋或文檔字符串(docstring)之后。

Python的函數與模塊
函數(Function)是組織好的、可重復使用的一段代碼。它能夠提高程序的模塊化程度和代碼利用率。函數使用關鍵字 def 定義。
模塊(Module)是一個保存好的Python文件。模塊可以由函數或者類組成。模塊和常規Python程序之間的唯一區別是用途不同:模塊用于被其他程序調用。因此,模塊通常沒有main函數。

Python的類與方法
類(Class)是用來描述具有一類相同的屬性和方法的集合。類的定義使用關鍵字 class。
被實例化的類的”函數”被稱作方法(Method)。類定義方法時候必須攜帶 self 關鍵字,它表示類的實例本身。

telnetlib介紹
telnetlib是Python標準庫中的模塊。它提供了實現Telnet功能的類telnetlib.Telnet。
這里通過調用telnetlib.Telnet類里的不同方法實現不同功能。


案例:使用telnetlib登陸設備
案例描述:
現有一臺網絡設備作為Telnet服務器,需要實現使用Python telnetlib作為Telnet客戶端登錄此設備。

實現過程分為四個步驟:
1、配置設備Telnet服務。
2、手動驗證和查看Telnet登錄步驟,作為代碼實現的參考。
3、編寫和運行Python代碼。
4、驗證結果。
案例:使用telnetlib登陸設備

配置設備接口地址:
[Huawei] interface GE 1/0/0
[Huawei -GE1/0/0] ip add 192.168.10.10 24
[Huawei -GE1/0/0] quit
配置設備Telnet服務:
[Huawei] user-interface vty 0 4
[Huawei-ui-vty0-4] authentication-mode password
[Huawei-ui-vty0-4] set authentication password simple Huawei@123
[Huawei-ui-vty0-4] protocol inbound telnet
[Huawei-ui-vty0-4] user privilege level 15
[Huawei-ui-vty0-4] quit
[Huawei] telnet server enable
案例:使用telnetlib登陸設備


案例:使用telnetlib登陸設備


案例:運行結果對比

手動Telnet登錄結果:
C:UsersRichard>telnet 192.168.10.10
Login authentication
Password:
Info: The max number of VTY users is 5, and the number of current VTY users on line is 1. The current login time is 2020-01-15 21:12:57.
<Huawei>
Python代碼運行結果:
#編譯器運行Python代碼
Info: The max number of VTY users is 5, and the number
of current VTY users on line is 1.
The current login time is 2020-01-15 22:12:57.
<Huawei>
總結:
網絡自動化是通過工具實現網絡自動化的部署、運行和運維,逐步減少對“人”的依賴。可以通過編程語言或者工具實現。
Python是一門完全開源的高級編程語言,語法簡單,容易學習。擁有豐富的標準庫和第三方庫,適用于網絡工程領域。
Python的telnetlib模塊提供了實現Telnet功能的類telnetlib.Telnet。可以讓您初窺網絡編程與自動化世界!華為更多開放可編程內容請參考HCIP-Datacom!