前沿拓展:
net4.0
net4.0是內(nèi)部Windows組件。
再離微福色NETFramewo對類型大不相同的應(yīng)用程序(如基于Windows的應(yīng)用程序和基于Web的應(yīng)用程序)時保持一致。按照工業(yè)標(biāo)準(zhǔn)生成所有通信,以確保基于NETFramework的代碼可與任何其他代碼集細(xì)成。
read_timeout的值,如下圖所示:
另外,出于兼容性考慮,還可以在字典里將delay_factor_compact設(shè)為True,這樣Netmiko 4會按照Netmiko 3的模式繼續(xù)使用fast_cli, delay_factor和global_delay_factor來計算等待時間,如下圖所示。
2. send_multiline()和send_multiline_timing()
在《網(wǎng)絡(luò)工程師的Python之路 — Netmiko終極指南》實驗8里曾經(jīng)提到過如何處理設(shè)備交互命令的場景,比如在思科交換機(jī)上輸入del flash0:/test.txt這個刪除flash:下文件的命令后,系統(tǒng)會詢問你是否confirm,如下圖所示。
或者使用extended ping模式后,系統(tǒng)讓你輸入一系列的和ping相關(guān)的參數(shù),如下圖所示。
在《網(wǎng)絡(luò)工程師的Python之路 — Netmiko終極指南》實驗8中我們是通過Netmiko 3中的send_command()配合expect_string來應(yīng)對這個問題。但是這種做法非常復(fù)雜且要寫大量代碼完成,比如說應(yīng)對第一個del flash0:/test.txt的場景時,因為該交互場景只需要我們輸入一個參數(shù)(是否confirm),所以代碼相對還比較簡潔,如下圖所示。
但是遇到extended ping模式這種需要用戶輸入多個參數(shù)的交互場景時,代碼量就非??植懒耍缦聢D所示。
究其原因就是send_command()函數(shù)是基于內(nèi)容的(pattern-based),它必須要等到用戶告訴它等到什么回顯內(nèi)容后才會執(zhí)行后面的代碼。同樣應(yīng)對extended ping的交互命令場景時,如果我們用基于時間(time-based)的send_command_timing()函數(shù)來處理的話,代碼量會相對小很多,如下圖所示。
而在Netmiko 4中加入的send_multiline()和send_multiline_timing()則將類似的需求變得更簡單,其中前者為pattern-based,后者為time-based。第一來看怎么用send_multiline()應(yīng)對第一個del flash0:/test.txt的場景,代碼如下圖所示。
可以看到,我們在cmd_list這個列表里額外添加了兩組子列表,每組子列表的元素為我們輸入的命令,以及執(zhí)行該命令后我們想要Netmiko在回顯內(nèi)容中抓取到的字符(類似send_command()的expect_string)。比如說第一組子列表里,我們輸入命令del flash0:/test.txt,希望抓取到的回顯內(nèi)容為"Delete flash0:/test.txt?"],第二組子列表里我們輸入命令n,希望抓取到的回顯內(nèi)容改為confirm,以此類推。
如果用time-based的send_multiline_timing()來做的話,上述代碼還能更簡潔,如下圖所示。
而在extended ping場景中,如果用send_multiline_timing()來做的話,代碼如下圖所示。
很顯然在處理多交互命令的場景時,在Netmiko 4中加入的send_multline()和send_multiline_timing()將Netmiko 3時代的send_command()和send_command_timing()的代碼大大簡化了。另外我們也注意到send_multiline_timing()的代碼比send_multiline()更簡單易懂,不過相較于send_multiline(),使用send_multiline_timing()的話有一個劣勢,那就是每輸入一條命令后,Netmiko會默認(rèn)固定等待2秒鐘才會執(zhí)行下一條命令(因為send_multiline_timing()是time-based的),而pattern-based的send_multiline()則會在讀取到指定的回顯內(nèi)容后立即執(zhí)行后面的代碼。魚和熊掌不可兼得,一個代碼簡單腳本但運行速度慢,一個代碼稍微復(fù)雜但腳本運行速度快,如何取舍完全看用戶自己的決定。
3. ConnLogOnly
使用Netmiko 3或之前的版本時,用戶需要寫很多try/except異常處理來應(yīng)對各種各樣會導(dǎo)致腳本停止工作的錯誤或異常,比如最常見的因為SSH用戶名/密碼驗證不通過導(dǎo)致的NetmikoAuthenticationException和設(shè)備鏈接超時無響應(yīng)導(dǎo)致的NetmikoTimeoutException,類似這樣的異常處理在設(shè)備數(shù)量眾多大型網(wǎng)絡(luò)里基本是標(biāo)配(設(shè)備數(shù)量越多,發(fā)生問題的概率越大),如下圖所示。
在Netmiko 4中,我們可以用ConnLogOnly替代ConnectHandler來統(tǒng)一處理這個問題,代碼如下圖所示。
使用ConnLogOnly時,如果其返回值為None,則Netmiko會直接判定登陸設(shè)備失?。ㄈ绻顷懗晒?,則和ConnectHandler一樣返回一個Netmiko連接對象(Netmiko Connection Object)。如果要查看具體登陸失敗的原因的話,可以在運行腳本后Netmiko生成的netmiko.log文件中查看(netmiko.log也是Netmiko 4新引入,Netmiko 3之前沒有的功能),netmiko.log文件和腳本文件在同一文件夾下,如下圖所示。
拓展知識:
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請注明出處:http://xiesong.cn/18644.html