第二个函数operate_on_ip_network()用来完成和网络相关的操作,即生成网络ID、掩码、广播、版本、网络上的已知信息、IPv6地址的显示方式,最后生成该子网内的所有IP地址 。
注意,net.info只能对公共IP地址生成可用信息,对私有IP地址不起作用 。
同样,在使用之前需要先从netaddr模块导入IP Network和IP Address 。
脚本运行结果如下所示 。
文章插图
4.4 简单的用例随着网络变得越来越大,其中包含更多来自各种不同供应商的设备,这就需要创建模块化的Python脚本来自动执行各种任务 。接下来的几节将分析3个用例,这些用例可以从网络中收集不同信息,缩短解决问题所需的时间,或者至少将网络配置恢复到其上次已知的良好状态 。使用自动化工作流来处理网络故障、修复网络环境,网络工程师能够更关心工作完成情况,提高业务水平 。
4.4.1 备份设备配置备份设备配置对于任何一名网络工程师来说都是最重要的任务之一 。在这个用例中,我们将使用netmiko库设计一个示例Python脚本 。该脚本用来备份设备配置,它适用于不同的供应商和平台 。
为方便日后访问或引用,我们将根据设备IP地址格式化输出文件名,例如,SW1备份操作的输出文件保存在dev_10.10.88.111_.cfg中 。
创建Python脚本从定义交换机开始,我们希望将其配置备份为文本文件(设备文件),用逗号分隔访问设备的用户名、密码等详细信息 。这样就可以在Python脚本中使用split()函数来获取这些数据,方便在ConnectHandler函数中使用这些数据 。此外,还可以从Microsoft Excel工作表或任何数据库中轻松导出该文件以及把该文件导入其中 。
文件结构如下 。
<device_ipaddress>,<username>,<password>,<enable_password>,<vendor>
文章插图
创建Python脚本,使用with open子句在脚本中导入该文件 。在导入的文件对象上使用readlines()方法将文件中的每一行组成列表,然后用for循环逐行遍历文件,用split()函数获取每一行中用逗号隔开的设备信息,并将它们赋予相应的变量 。
from netmiko import ConnectHandlerfrom datetime import datetimewithopen("/media/bassim/DATA/googleDrive/Packt/EnterpriseAutomationProject/Chapter5_Using_Python_to_manage_network_devices/UC1_devices.txt") asdevices_file:devices = devices_file.readlines()for line in devices:line = line.strip("n")ipaddr = line.split(",")[0]username = line.split(",")[1]password = line.split(",")[2]enable_password = line.split(",")[3]vendor = line.split(",")[4]if vendor.lower() == "cisco":device_type = "cisco_ios"backup_command = "show running-config"elif vendor.lower() == "juniper":device_type = "juniper"backup_command = "show configuration | display set"
由于我们的目标是创建模块化的、支持多种设备供应商的脚本,因此在if子句中需要检查设备供应商,并为该设备分配正确的device_type和backup_command 。接下来,建立与设备的SSH连接,使用netmiko模块中的.send_command()方法执行备份命令 。
print str(datetime.now()) + " Connecting to device {}" .format(ipaddr)net_connect = ConnectHandler(device_type=device_type,ip=ipaddr,username=username,password=password,secret=enable_password)net_connect.enable()running_config = net_connect.send_command(backup_command)print str(datetime.now()) + " Saving config from device {}" .format(ipaddr)f = open( "dev_" + ipaddr + "_.cfg", "w")f.write(running_config)f.close()print "=============================================="
在最后的几行中,以写入方式打开一个文件(文件不存在时将自动创建),文件名中包含了前面从设备文件中读取的ipaddr变量 。脚本运行结果如下 。
文章插图
需要注意的是,备份的配置文件存储在项目的主目录中,文件名称包含每个设备的IP地址(见下图) 。
文章插图
4.4.2 创建访问终端在Python或其他编程活动中,你就是自己的设备供应商 。为了满足自己的需求,你可以创建任何喜欢的代码组合和程序 。在第二个例子中我们创建自己的终端(terminal),通过telnetlib访问路由器 。只需要在终端写几个单词,就会在网络设备中执行很多命令并返回输出结果 。输出结果将会显示在标准输出或保存在文件中 。
使用Linux服务器上的cron任务,或Windows服务器上的计划任务,可让服务器在指定时间运行上面的Python脚本 。例如,每天凌晨运行一次,将配置信息存储在latest目录中,以方便运维团队使用 。
推荐阅读
- 四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?
- Pyppeteer爬虫神器详解
- 6s管理包括哪六个方面?
- 出现化妆品过敏怎么办
- 《管理学原理》试卷a 2020?管理学原理试卷及答案
- 照相机的使用方法和注意事项
- ticpods2ai真无线耳机?ticpods2pro单耳使用
- 使用 Go 打造另一款简单实用的 ORM
- 使用Redis轻松实现秒杀系统
- 使用Arkime抓包,捕获解密HTTPS流量