使用Python管理网络设备( 七 )


#!/usr/bin/python__author__ = "Bassim Aly"__EMAIL__ = "basim.alyy@gmail.com"import telnetlibconnection = telnetlib.Telnet(host="10.10.88.110")connection.read_until("Username:")connection.write("admin" + "n")connection.read_until("Password:")connection.write("access123" + "n")connection.read_until(">")connection.write("en" + "n")connection.read_until("Password:")connection.write("access123" + "n")connection.read_until("#")connection.write("terminal length 0" + "n")connection.read_until("#")while True:command = raw_input("#:")if "health" in command.lower():commands = ["show ip int b","show ip route","show clock","show banner motd"]elif "discover" in command.lower():commands = ["show arp","show version | i uptime","show inventory",]else:commands = [command]for cmd in commands:connection.write(cmd + "n")output = connection.read_until("#")print outputprint "==================="首先,建立到路由器的Telnet连接并输入相应的用户信息,一直到打开特权(enable)模式 。然后,创建一个始终为true的无限while循环,使用内置的raw_input()函数捕捉用户输入的命令 。脚本捕获到用户输入之后,在网络设备上执行这些命令 。
如果用户输入关键字health或discover,终端将自动执行一系列命令以反映期望的操作 。这些关键字在排除网络故障时非常有用,可以根据常用的操作自由扩展它们 。想象一下,在需要解决两个路由器之间的开放式最短路径优先(Open Shortest Path First,OSPF)邻居问题时,只要打开自己的Python终端脚本(这个脚本中已经写好了几个排除故障常用的命令),并将这些命令打包到诸如tshoot_ospf之类的if条件之后 。一旦脚本看到这个关键字,它就会执行这些命令,输出OSPF邻居状态、MTU的接口、OSPF的广播网络等,简化定位问题的过程 。
通过在提示符中输入health尝试脚本中的第一条命令 。脚本输出结果如下 。

使用Python管理网络设备

文章插图
 
可以看到,脚本将返回在设备上执行多条命令后的结果 。
接着试一下第二个命令discover 。脚本输出结果如下 。
使用Python管理网络设备

文章插图
 
这次脚本返回discover命令的输出 。在后面的章节中,我们将会解析返回的输出结果并从中提取有用的信息 。
4.4.3 从Excel工作表中读取数据网络和IT工程师始终使用Excel工作表来存储基础设施的相关信息,如IP地址、设备供应商和登录凭证 。Python支持从Excel工作表中读取数据并对其进行处理,以便我们在脚本中使用数据 。
在这个用例中,我们将使用Excel Read(xlrd)模块读取UC3_devices.xlsx文件 。该文件保存了基础设施的主机名、IP地址、用户名、普通密码、特权模式下的密码和供应商名称 。然后将读到的数据用作netmiko模块的输入 。
Excel工作表中的内容如下图所示 。
使用Python管理网络设备

文章插图
 
首先,用pip安装xlrd模块,因为需要用它来读取Microsoft Excel工作表 。
pip install xlrdxlrd模块能够读取Excel工作表并将行和列转换为矩阵 。比如,row[0][0]代表第一行第一列的单元格,右边紧接着它的单元格是row[0][1](见下图),以此类推 。
使用Python管理网络设备

文章插图
 
xlrd在读取工作表时,每次读取一行,同时特殊计数器nrows(行数)自动加1 。同样,每次读取一列,ncols(列数)自动加1,这样我们就能够通过这两个参数知道矩阵的大小 。
然后,在xlrd的open_workbook()函数中输入文件路径,并用sheet_by_index()或sheet_by_name()函数访问工作表 。在本例中,数据存储在第一个工作表(index = 0)中,工作表文件存储在以章为名的文件夹下 。接着,遍历工作表的每一行,或者使用row()函数来访问指定行 。返回的输出结果是一个列表,使用索引可以访问列表中的元素 。
Python脚本如下 。
__author__ = "Bassim Aly"__EMAIL__ = "basim.alyy@gmail.com"from netmiko import ConnectHandlerfrom netmiko.ssh_exception import AuthenticationException,NetMikoTimeoutExceptionimport xlrdfrom pprint import pprintworkbook =xlrd.open_workbook(r"/media/bassim/DATA/GoogleDrive/Packt/EnterpriseAutomationProject/Chapter4_Using_Python_to_manage_network_devices/UC3_devices.xlsx")sheet = workbook.sheet_by_index(0)for index in range(1, sheet.nrows):hostname = sheet.row(index)[0].valueipaddr = sheet.row(index)[1].valueusername = sheet.row(index)[2].valuepassword = sheet.row(index)[3].valueenable_password = sheet.row(index)[4].valuevendor = sheet.row(index)[5].valuedevice = {'device_type': vendor,'ip': ipaddr,'username': username,'password': password,'secret': enable_password,}# pprint(device)print "########## Connecting to Device {0}############".format(device['ip'])try:net_connect = ConnectHandler(**device)net_connect.enable()print "***** show ip configuration of Device *****"output = net_connect.send_command("show ip int b")print outputnet_connect.disconnect()except NetMikoTimeoutException:print "=======SOMETHING WRONG HAPPEN WITH{0}=======".format(device['ip'])except AuthenticationException:print "=======Authentication Failed with{0}=======".format(device['ip'])except Exception as unknown_error:print "=======SOMETHING UNKNOWN HAPPEN WITH {0}======="


推荐阅读