现在,我们已经知道如何在不同的操作系统中使用和安装Python,以及如何使用EVE-NG构建网络拓扑。在本章中,我们将学习如何使用常用的网络自动化库来自动完成各种网络任务。Python可以与不同网络层的网络设备进行交互。
首先,Python可以通过socket编程和socket模块操纵底层网络,从而在Python的操作系统和网络设备之间构建一个底层的网络接口。此外,Python模块可以通过Telnet、SSH和API与网络设备进行更高层次的交互。本章将深入讨论如何使用Python中的Telnet和SSH模块在远程设备上建立连接和执行命令。
1 技术要求
检查以下工具是否安装正确,并确保它们可以正常使用:
Python 2.7.1x;PyCharm社区版或专业版;EVE-NG,网络仿真器的安装和配置请参阅第3章。
有关本章中出现的所有脚本,请访问GitHub网站。
1.1 Python和SSH
SSH和Telnet的区别在于客户端和服务器端交换数据的通道不同。SSH使用安全链接,它在客户端和设备之间创建一个由不同安全机制加密的隧道,因此很难解密通信内容。因此,当需要保证网络安全时,网络工程师会首先选择使用SSH协议。
Paramiko库遵循SSH2协议,支持认证、密钥处理(DSA、RSA、ECDSA和ED25519)和其他SSH功能(如代理命令和SFTP)。当您需要使用SSH连接网络设备时,通常会在Python中使用这个库。
1.2 Paramiko模块
Paramiko是Python中使用最广泛的SSH模块。模块本身是用Python语言编写开发的,只有crypto这样的核心函数才会用C语言。从它的官方GitHub链接可以看到代码贡献者、模块历史等大量信息。
1.安装模块
打开Windows cmd或Linux shell,运行以下命令从PyPI下载最新的Paramiko模块。如下图所示,同时该命令会自动下载其他依赖包(如cyrptography、ipaddress和six)并安装在电脑上。
pip install paramiko
pip安装paramiko
在命令行输入Python,然后导入Paramiko模块,验证安装是否成功。如下图所示,正确安装后,模块可以成功导入。换句话说,命令行上不会有错误提示。
2.用SSH连接网络设备
如前所述,要使用Paramiko模块,首先需要在Python脚本中导入它,然后通过继承SSHClient()创建一个SSH client。然后,设置Paramiko的参数,使其可以自动添加任何未知的主机密钥,并信任与服务器的连接。接下来,传递远程主机的信息(IP地址、用户名和密码等。)到连接函数。
#!/usr/bin/python _ _ author _ _ = & # 34;巴西姆阿里& # 34;_ _ EMAIL _ _ = & # 34basim . alyy @ Gmail . com & # 34;import paramiko import time channel = paramiko。ssh client()channel . set _ missing _ host _ key _ policy(paramiko。autoadd policy())channel . connect(hostname = & # 34;10.10.88.112",用户名= & # 39;管理& # 39;,密码= & # 39;access123 & # 39,look _ for _ keys = false,allow _ agent = false)shell = channel。invoke _ shell () autoaddpolicy()是一个策略,可以作为函数set_missing_host_key_policy()的输入参数。在虚拟实验室环境中推荐使用这种策略,但在生产环境中应该更加严格,比如WarningPolicy()或RejectPolicy()。
最后,invoke_shell()将启动一个连接到SSH服务器的交互式shell会话。其他一些参数(如端子类型、宽度、高度等。)可以在调用这个函数的时候传入。
Paramiko的连接参数如下。
Look_For_Keys:默认为True,强制Paramiko使用密钥进行身份验证。也就是说,用户需要使用私钥和公钥对网络设备进行身份验证。在这里使用密码验证,因此将该参数设置为False。allow_agent:表示是否允许连接到SSH代理,默认为True。在用密钥验证时可能需要使用这个选项。由于这里使用的是用户名/密码,因此禁用它。
最后向设备终端发送各种命令(如show ip int b和show arp),将返回的结果输出到Python窗口。
shell . send(& # 34;启用\ n & # 34)shell . send(& # 34;access123 \ n & # 34)shell . send(& # 34;终端长度0 \ n & # 34)shell . send(& # 34;显示ip int b \ n & # 34)shell . send(& # 34;显示arp \ n & # 34)time . sleep(2)print shell . recv(5000)channel . close()脚本运行结果如下图所示。
如果需要在远程设备上执行一个需要很长时间的命令,就要强制Python等待一段时间,直到设备生成输出并将结果返回给Python,所以最好使用time.sleep()。否则,Python可能得不到正确的输出。
1.3 netmiko模块
Netmiko是Paramiko的增强版,是专门为网络设备设计的。虽然Paramiko可以处理与设备的SSH连接,判断设备类型是服务器、打印机还是网络设备,但是netmiko在设计上是针对网络设备进行优化的,可以更有效的处理SSH连接。Netmiko还支持各种设备制造商和平台。
Netmiko也是Paramiko的一个封装。它扩展了Paramiko的许多其他增强功能,例如使用启用的密码直接访问支持的设备,从文件中读取配置并将其推送到设备,在登录期间禁用分页显示,以及默认情况下在每个命令后添加回车“\n”。
1.支持的设备商
Netmiko支持许多供应商的设备,并定期将新的供应商添加到支持列表中。netmiko支持的供应商列表可分为定期测试、有限测试和实验测试。这个列表可以在模块的GitHub页面上找到。
定期测试类支持的供应商如下图所示。
下图显示了有限测试类中支持的供应商。
实验类支持的供应商如下图所示。
2.安装和验证
安装netmiko非常简单。打开Windows命令行窗口或Linux shell,执行下面的命令从PyPI获取最新版本的netmiko包(见下图)。
pip install netmiko
请注意,这里看到的输出删除了命令行中的命令回显和设备提示符。默认情况下,netmiko会替换设备返回的结果,使输出更加干净,替换过程通过正则表达式完成,这将在下一章介绍。
如果不想使用此方法,但希望看到命令提示符并在返回结果后执行命令,可以将以下参数添加到。send_command()函数。
output = connection . send _ command(& # 34;显示ip int b & # 34,strip _ command = false,strip_prompt=False)strip _ command = False和strip _ prompt = False告诉netmiko保留命令行回显和提示,而不是替换它们。默认情况下为真,可以根据需要进行设置。
4.使用netmiko配置设备
Netmiko可以通过SSH配置远程设备,通过。config方法,然后根据列表格式中的信息(配置列表)配置设备。配置列表可以直接写在Python脚本中,也可以从文件中读取,然后通过readlines()的方法转换成列表。
从netmiko导入ConnectHandlerSW2 = { & # 39设备类型& # 39;: '思科_ ios & # 39,'ip & # 39: '10.10.88.112','用户名& # 39;: '管理& # 39;,'密码& # 39;: 'access123 & # 39,'秘密& # 39;: 'access123 & # 39,} core _ SW _ config =[& # 34;int范围gig 0/1-2 & # 34;,"交换机端口中继封装& # 34,"交换端口模式中继& # 34;,"交换机端口中继允许的vlan1、2 & # 34;]打印& # 34;##########正在连接到设备{ 0 } # # # # # # # # # # & # 34;。格式(SW2[& # 39;ip & # 39])net _ connect = connect handler(* * SW2)net _ connect . enable()print & # 34;*****向设备发送配置* * * * * & # 34;net _ connect . send _ config _ set(core _ SW _ config)上面的脚本以另一种形式连接SW2,进入特权模式。但是这一次,使用了另一个netmiko方法——send _ config _ set()。这种方法需要使用列表形式的配置文件,同时进入设备配置模式,根据列表配置设备。这里测试了一个简单的配置,即修改gig0/1和gig0/2,并将这两个端口配置为中继模式。在设备上执行show run命令时,如果该命令执行成功,将会出现类似以下内容的输出。
5.netmiko中的异常处理
在设计Python脚本时,我们可能会假设设备已经启动并正在运行,并且用户已经提供了正确的登录信息,但情况并非总是如此。有时Python和远程设备之间的网络连接可能有问题,或者用户输入了错误的登录信息。如果发生这种情况,Python通常会抛出异常并退出,但这种解决方案显然并不完美。
Netmiko。Netmiko中的异常处理模块ssh _ exception提供了一些可以处理上述情况的异常处理类。第一个类AuthenticationException可以捕获远程设备中的身份验证错误。第二个类netmikoTimeoutException可以捕获NetMiko和设备之间的超时或任何连接问题。以下示例使用try-except子句包含ConnectHandler()方法来捕获超时和身份验证异常。
从netmiko导入ConnectHandlerfrom从netmiko.ssh_exception导入身份验证异常,netmikotimeoutexception device = { & # 39;设备类型& # 39;: '思科_ ios & # 39,'ip & # 39: '10.10.88.112','用户名& # 39;: '管理& # 39;,'密码& # 39;: 'access123 & # 39,'秘密& # 39;: 'access123 & # 39,}打印& # 34;##########正在连接到设备{ 0 } # # # # # # # # # # & # 34;。格式(设备[& # 39;ip & # 39])try:net _ connect = connect handler(* * device)net _ connect . enable()print & # 34;*****显示设备的ip配置* * * * * & # 34;output = net _ connect . send _ command(& # 34;显示ip int b & # 34)打印outputnet_connect.disconnect()除NetMikoTimeoutException:print & # 34;= = = = = = = = = = = = { 0 }出现了问题= = = = = = = = = = = = = & # 34;。格式(设备[& # 39;ip & # 39])除了AuthenticationException:print & # 34;=========验证失败,结果为{ 0 } = = = = = = = = = = = = = & # 34;。格式(设备[& # 39;ip & # 39])作为未知的异常除外_ error:print & # 34;= = = = = = = = = = = = { 0 }发生了未知情况= = = = = = = = = = = = & # 34;6.设备的自动发现
Netmiko提供了一种“猜测”设备类型和发现设备的机制。通过使用SNMP发现OIDS并在远程控制台上执行多个show命令,可以根据输出字符串检测路由器的操作系统和类型。然后,Netmiko将相应的驱动程序加载到ConnectHandler()类中。
#!/usr/local/bin/python _ _ author _ _ = & # 34;巴西姆阿里& # 34;_ _ EMAIL _ _ = & # 34basim . alyy @ Gmail . com & # 34;从netmiko导入SSHDetect,Netmikodevice = { & # 39设备类型& # 39;: '自动检测& # 39;,'主持人& # 39;: '10.10.88.110','用户名& # 39;: '管理& # 39;,'密码& # 39;: "access123 & # 34,} detect _ device = ssh detect(* * device)device _ type = detect _ device . auto detect()print(device _ type)print(detect _ device . potential _ matches)device[& # 39;设备类型& # 39;]= device _ type connection = net miko(* * device)在上面的脚本中,需要注意以下几点。
首先,设备字典中的device_type等于autodetect,它告诉netmiko在检测到设备类型之前不要加载驱动。
然后,使用netmiko的SSHDetect()类来发现设备。它使用SSH连接到设备并执行一些命令来找出操作系统的类型,结果以字典的形式返回。
然后,使用autodetect()函数将匹配度最高的结果赋给device_type变量。
接下来,输出potential_matches以查看字典中所有返回的结果。
最后,您可以更新设备字典并为其分配一个新的device_type。
2 在Python中使用Telnet协议
Telnet是TCP/IP协议栈中最早可用的协议之一,主要用于服务器和客户端之间建立连接和交换数据。服务器监听TCP端口23,并等待来自客户端的连接请求。
在以下示例中,我们将创建一个Python脚本作为Telnet客户端,并将拓扑中的其它路由器和交换机作为Telnet服务器。Python的原生telnetlib库已经支持Telnet,所以不需要单独安装。
可以通过在telnetlib模块中实例化Telnet()类来创建客户端对象。通过这个对象,我们可以在telnetlib中使用两个重要的函数——read _ until()(用于读取输出结果)和write()(用于将内容写入远程设备)。这两个函数用于与Telnet连接交互,从Telnet连接读取数据或向其写入数据。
还有一个重点是,用read_until()读取Telnet连接的内容后,缓冲区会被清空空,无法再次读取。因此,如果之前读取的重要数据将在后期处理中使用,则需要将其作为变量保存在脚本中。
Telnet数据以明文形式发送,因此可以通过中间人攻击捕获和查看,例如用户信息和密码。即便如此,一些服务提供商和企业仍然使用它,但他们将集成VPN和radius/tacacs协议,以提供轻量级和安全的访问。
让我们一步步来分析这个脚本。
(1)将telnetlib模块导入Python脚本,在变量中定义用户名和密码。代码如下。
导入telnetlibusername = & # 34管理& # 34;密码= & # 34;access123 & # 34enable _ password = & # 34access123 & # 34(2)定义一个变量来建立与远程主机的连接。注意,只需要提供远程主机的IP地址,连接建立时不需要提供用户名或密码。
cnx = telnetlib。Telnet(主机= & # 34;10.10.88.110")#我们到了& # 39;Re Telnet toGateway(3)通过读取Telnet连接返回的输出并搜索关键字“Username:”来提供Telnet连接的用户名。然后写管理员用户名。如有必要,以同样的方式输入Telnet密码。
cnx . read _ until(& # 34;用户名:& # 34;)cnx.write(用户名+& # 34;\ n & # 34)cnx . read _ until(& # 34;密码:& # 34;)cnx.write(密码+& # 34;\ n & # 34)cnx . read _ until(& # 34;& gt")cnx . write(& # 34;恩& # 34;+ "\ n & # 34)cnx . read _ until(& # 34;密码:& # 34;)cnx . write(enable _ password+& # 34;\ n & # 34Telnet连接建立后,在脚本中添加一个控制台提示是非常重要的;否则,连接将陷入无限循环。那么Python脚本将超时并出现错误。
(4)将show ip interface brief命令写入Telnet连接,并开始读取返回的内容,直到出现路由器提示符(#)。可以通过以下命令获得路由器的接口配置。
cnx . read _ until(& # 34;#")cnx . write(& # 34;显示ip int b & # 34+ "\ n & # 34)output = cnx . read _ until(& # 34;#"打印输出的完整脚本如下所示。
脚本的运行结果如下。
请注意,执行的命令show ip int b包含在输出中,路由器提示符“R1#”在stdout中输出并返回。可以使用replace()等内置字符串函数将它们从输出中清除。
cleaned_output = output.replace("show ip int b","").replace("R1#","")print cleaned_output
当然,也可以通过交换机控制台查看运行结果(只显示部分结果)。
3 使用netaddr处理IP地址和网络
管理和操作IP地址是网络工程师最重要的任务之一。Python开发者提供了一个惊人的库——net addr,可以识别和处理IP地址。假设您开发了一个应用程序,其中您需要获得129.183.1.55/21,的网络地址和广播地址,您可以通过模块中内置的network和broadcast方法轻松获得相应的地址。
net . network 129 . 183 . 0 . net . broadcast 129 . 183 . 0 . 0 net addr支持很多功能。
Netaddr在第3层地址中支持以下功能。
识别IPv4和IPv6地址、子网、掩码和前缀。对IP网络进行迭代、切片、排序、汇总和分类。处理各种格式(CIDR、任意子网长度、nmap)。对IP地址和子网进行集合操作(联合、交叉等)。解析各种不同的格式和符号。查找IANA IP块信息。生成DNS反向查找结果。检索超网和生成子网。
Netaddr在第2层地址中支持以下功能。
展示和操作Mac地址与EUI-64标识符。查找IEEE组织信息(OUI、IAB)。生成链路本地的IPv6地址。3.1 安装netaddr
使用pip安装netaddr模块,命令如下。
pip install netaddr安装完成后,打开PyCharm或Python控制台,导入模块,验证模块是否安装成功。如果没有出现错误消息,则模块安装成功。
python & gt& gt& gt导入netaddr3.2使用netaddr的方法netaddr模块提供了两个重要的方法来定义和处理IP地址。第一种方法是IPAddress(),用于定义带有默认子网掩码的单个有类IP地址。第二种方法是IPNetwork(),它使用CIDR来定义无类IP地址。
这两种方法都将IP地址视为字符串,并根据该字符串返回IP地址或IP网络对象。返回的对象可以继续执行很多方法,比如判断IP地址是单播地址、组播地址、环回地址、私有地址还是公有地址,地址有效还是无效。这些运算的结果是真还是假。可以在Python的if条件中直接使用这些方法。
此外,该模块支持使用比较运算符(如= =、)比较两个IP地址,以生成子网。它还可以检索给定IP地址或子网术语的超网列表。最后,netaddr模块可以生成有效主机的完整列表(不包括网络IP地址和网络广播地址)。
#!/usr/bin/python _ _ author _ _ = & # 34;巴西姆阿里& # 34;_ _ EMAIL _ _ = & # 34basim . alyy @ Gmail . com & # 34;从netaddr导入IPNetwork,IP address def check _ IP _ address(IP addr):IP _ attributes =[]IP address = IP address(IP addr)if IP address . is _ private():IP _ attributes . append(& # 34;IP地址是私有的& # 34;)else:IP _ attributes . append(& # 34;IP地址是公共的& # 34;)if IP address . is _ unicast():IP _ attributes . append(& # 34;IP地址是单播& # 34;)elif IP address . is _ multicast():IP _ attributes . append(& # 34;IP地址是多播& # 34;)if IP address . is _ loopback():IP _ attributes . append(& # 34;IP地址是环回的& # 34;)返回& # 34;\ n & # 34。join(IP _ attributes)def operate _ on _ IP _ network(ipnet):net _ attributes =[]net = IP network(ipnet)net _ attributes . append(& # 34;网络IP地址是& # 34;+str(net . network)+& # 34;网络掩码是& # 34;+str(net . net mask))net _ attributes . append(& # 34;广播是& # 34;+str(net . broadcast))net _ attributes . append(& # 34;IP版本是& # 34;+str(net . version))net _ attributes . append(& # 34;关于这个网络的已知信息是& # 34;+str(net . info))net _ attributes . append(& # 34;IPv6表示是& # 34;+str(net . IPv6()))net _ attributes . append(& # 34;网络规模为& # 34;+str(net . size))net _ attributes . append(& # 34;生成子网内的ip地址列表& # 34;)for IP in net:net _ attributes . append(& # 34;\ t & # 34+str(IP))return & # 34;\ n & # 34。join(net _ attributes)IP addr = raw _ input(& # 34;请输入IP地址:& # 34;)print check _ IP _ address(IP addr)ipnet = raw _ input(& # 34;请输入IP网络:& # 34;)打印operate_on_ip_network (ipnet)在上面的脚本中,首先使用raw_input()函数请求用户输入ip地址和IP网络,然后将输入值作为参数传递给两个用户方法check_ip_address()和operate_on_ip_network(),并调用它们。第一个函数check_ip_address()检查输入的ip地址,并尝试生成一个关于IP地址属性的报告(例如,IP地址是单播、组播、私有还是环回),并将输出返回给用户。
第二个函数operate_on_ip_network(),用于完成网络相关的操作,即生成网络ID、掩码、广播、版本、网络上的已知信息、ipv6地址的显示方式,最终生成子网内的所有IP地址。
请注意,net.info只能生成公共IP地址的可用信息,而不能生成私有IP地址的可用信息。
同样,使用前需要从netaddr模块导入IP网络和IP地址。
脚本的运行结果如下。
4 简单的用例
随着网络变得越来越大,其中包含来自不同供应商的更多设备,有必要创建模块化Python脚本来自动执行各种任务。以下部分将分析三种使用案例,它们可以从网络收集不同的信息,缩短解决问题所需的时间,或者至少将网络配置恢复到最近一次的良好状态。利用自动化工作流处理网络故障,修复网络环境,网络工程师可以更关心工作的完成情况,提高自己的业务水平。
4.1 备份设备配置
备份设备配置是任何网络工程师最重要的任务之一。在这个用例中,我们将使用netmiko库来设计一个示例Python脚本。该脚本用于备份设备配置,适用于不同的供应商和平台。
为了以后访问或参考,我们会根据设备的IP地址保存打印格式的文件名,例如dev_10.10.88.111_.cfg中SW1备份操作的输出文件。
创建Python脚本
从定义交换机开始,我们希望将其配置备份为文本文件(设备文件),并用逗号分隔用户名、密码和其他访问设备的详细信息。这样,您可以在Python脚本中使用split()函数来获取这些数据,这便于在ConnectHandler函数中使用这些数据。此外,您可以轻松地从Microsoft Excel工作表或任何数据库中导出和导入文件。
文件结构如下。
<device_ipaddress>,<username>,<password>,<enable_password>,<vendor>
需要注意的是,备份的配置文件存储在项目的home目录下,文件名中包含每个设备的IP地址(见下图)。
使用Linux服务器上的cron任务或Windows服务器上的计划任务,让服务器在指定时间运行Python脚本。比如每天早上运行一次,把配置信息保存在最新的目录下,方便运维团队。
4.2 创建访问终端
在Python或者其他编程活动中,你是自己的设备供应商。为了满足你的需求,你可以创建任何你喜欢的代码组合和程序。在第二个例子中,我们创建自己的终端,并通过telnetlib访问路由器。只要在终端写几个字,很多命令就会在网络设备中执行并返回输出结果。输出结果将显示在标准输出中或保存在文件中。
#!/usr/bin/python _ _ author _ _ = & # 34;巴西姆阿里& # 34;_ _ EMAIL _ _ = & # 34basim . alyy @ Gmail . com & # 34;导入telnetlibconnection = telnetlib。Telnet(主机= & # 34;10.10.88.110")connection . read _ until(& # 34;用户名:& # 34;)connection . write(& # 34;管理& # 34;+ "\ n & # 34)connection . read _ until(& # 34;密码:& # 34;)connection . write(& # 34;access123 & # 34+ "\ n & # 34)connection . read _ until(& # 34;& gt")connection . write(& # 34;恩& # 34;+ "\ n & # 34)connection . read _ until(& # 34;密码:& # 34;)connection . write(& # 34;access123 & # 34+ "\ n & # 34)connection . read _ until(& # 34;#")connection . write(& # 34;终端长度0 & # 34;+ "\ n & # 34)connection . read _ until(& # 34;#")为真时:command = raw _ input(& # 34;#:")如果& # 34;健康& # 34;in command . lower():commands =[& # 34;显示ip int b & # 34,"显示ip路由& # 34;,"显示时钟& # 34;,"显示横幅motd & # 34]elif & # 34;发现& # 34;in command . lower():commands =[& # 34;显示arp & # 34,"显示版本| i正常运行时间& # 34;,"显示库存& # 34;,]else:commands =[command]for cmd in commands:connection . write(cmd+& # 34;\ n & # 34)output = connection . read _ until(& # 34;#")打印输出print & # 34;==================="首先,建立到路由器的Telnet连接,并输入相应的用户信息,直到启用模式打开。然后,创建一个永远为真的无限while循环,使用内置的raw_input()函数捕获用户输入的命令。脚本捕获用户输入后,这些命令将在网络设备上执行。
如果用户输入关键字health或discover,终端将自动执行一系列命令来反映所需的操作。这些关键词在排查网络故障时非常有用,你可以根据常用操作自由展开。想象一下,当你需要解决两台路由器之间的开放最短路径优先(OSPF)邻居问题时,你只需要打开自己的Python终端脚本(该脚本中已经编写了几个常见的故障排除命令),将这些命令经过tshoot_ospf等if条件后打包。一旦脚本看到这个关键字,它将执行这些命令,输出OSPF邻居状态,MTU接口,OSPF广播网络等。,并简化查找问题的过程。
在提示符下输入health,尝试脚本中的第一个命令。该脚本的输出如下。
如您所见,在设备上执行多个命令后,脚本将返回结果。
然后尝试第二个命令discover。该脚本的输出如下。
该脚本返回discover命令的输出。在后面的章节中,我们将解析返回的输出并从中提取有用的信息。
4.3 从Excel工作表中读取数据
网络和IT工程师总是使用Excel工作表来存储有关基础设施的信息,如IP地址、设备供应商和登录凭证。Python支持从Excel工作表中读取数据并对其进行处理,以便我们可以在脚本中使用这些数据。
在这个用例中,我们将使用Excel Read(xlrd)模块来读取UC3_devices.xlsx文件。该文件存储主机名、IP地址、用户名、公共密码、特权模式下的密码和基础设施的供应商名称。然后将读取的数据作为netmiko模块的输入。
Excel工作表中的内容如下图所示。
首先,用pip安装xlrd模块,因为需要它来读取Microsoft Excel工作表。
Pip安装xlrdxlrd模块可以读取Excel工作表,将行列转换成矩阵。例如,row[0][0]表示第一行和第一列中的单元格,紧挨着右边的单元格是row[0][1](见下图),以此类推。
xlrd读取工作表时,一次读取一行,同时特殊计数器nrows自动递增1。同样,每读取一列,ncols(列数)自动加1,这样我们就可以通过这两个参数知道矩阵的大小。
然后,在xlrd的open_workbook()函数中输入文件路径,用sheet_by_index()或sheet_by_name()函数访问工作表。在本例中,数据存储在第一个工作表中(index = 0),工作表文件存储在名为chapter的文件夹中。接下来,遍历工作表的每一行,或者使用row()函数访问指定的行。返回的输出是一个列表,列表中的元素可以通过使用索引来访问。
Python脚本如下。
_ _ author _ _ = & # 34巴西姆阿里& # 34;_ _ EMAIL _ _ = & # 34basim . alyy @ Gmail . com & # 34;from net miko import connect handler from net miko . ssh _ exception import AuthenticationException,netmikotimeoutexception import xlrd from pprint import pprint workbook = xlrd . open _ workbook(r & # 34;/media/bassim/DATA/Google drive/Packt/EnterpriseAutomationProject/chapter 4 _ Using _ Python _ to _ manage _ network _ devices/UC3 _ devices . xlsx & # 34;)范围(1,sheet.nrows)中索引的sheet = workbook . sheet _ by _ index(0):hostname = sheet . row(index)[0]。value IP addr = sheet . row(index)[1]。value username = sheet . row(index)[2]。value password = sheet . row(index)[3]。value enable _ password = sheet . row(index)[4]。value vendor = sheet . row(index)[5]。valuedevice = { & # 39设备类型& # 39;:供应商,& # 39;ip & # 39:ipaddr,& # 39;用户名& # 39;:用户名,& # 39;密码& # 39;:密码,& # 39;秘密& # 39;:enable_password,}# pprint(设备)print & # 34##########正在连接到设备{ 0 } # # # # # # # # # # & # 34;。格式(设备[& # 39;ip & # 39])try:net _ connect = connect handler(* * device)net _ connect . enable()print & # 34;*****显示设备的ip配置* * * * * & # 34;output = net _ connect . send _ command(& # 34;显示ip int b & # 34)打印outputnet_connect.disconnect()除NetMikoTimeoutException:print & # 34;= = = = = = = { 0 }出现了问题= = = = = = = = & # 34;。格式(设备[& # 39;ip & # 39])除了AuthenticationException:print & # 34;=======身份验证失败,结果为{ 0 } = = = = = = = & # 34;。格式(设备[& # 39;ip & # 39])作为未知的异常除外_ error:print & # 34;= = = = = = = { 0 }发生了未知情况= = = = = = = & # 34;4.4其他使用案例
Netmiko可以用来实现很多网络自动化用例。例如,在升级期间,从远程设备上传/下载文件,使用Jinja2模板加载配置,访问终端服务器,访问终端设备等。更多用例请参考GitHub官网(见下图)。
5 小结
在这一章中,我们开始使用Python进入网络自动化的世界。本章讨论Python中的一些工具,通过Telnet和SSH建立到远程节点的连接,以及在远程设备上执行命令。此外,本章还介绍了如何借助netaddr模块处理IP地址和网络子网。最后,通过两个实际使用案例巩固知识。
下一章将介绍如何处理返回的输出结果并从中提取有用的信息。
本文摘自Python自动化运维。
Python自动化运维实战:使用Python管理网络设备运维工程师教程书籍,自动化运维实践通过Python模块、库与工具自动配置和管理大量服务器的讲解,提高运维的效率
《Python自动化运维实践》介绍了如何通过Python自动完成服务器的配置和管理,自动完成系统的管理任务(如用户管理、数据库管理、进程管理),以及完成这些任务所需的模块、库和工具。此外,本书还讲述了如何使用Python脚本自动执行测试,如何通过Python在云基础设施和虚拟机上自动执行任务,以及如何使用基于Python的安全工具自动完成安全相关的任务。
本书适合运维人员和开发人员阅读,也可以作为相关专业人员的参考书。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。