netmiko概述:作为paramiko的高级软件包,netmiko旨在简化各种网络提供商和平台之间低效的telnet (ssh )管理。

netmiko的基本代码和支持的设备包括:

3359 blog.csdn.net/tushanpeipei/article/details/113704076? spm=1001.2014.3001.5501

textfsm概述: textfsm是一个开源python库,通过定制模板,可以根据预定模板输出网络设备的输出格式。 例如,在cisco交换机上通过netmiko使用命令。 show ip interfcae brief可以获得以下字符串信息:

CSR 1000 v # showipinterfacebriefinterfaceip-address ok? methodstatusprotocolgigabitethernet 1192.168.0.66 yesnvramupupgigabitethernet 210.1.1 yesnvramupupgigabitethernet3unet .1yesnvramupupvirtualportgroup 030.1.1.254 yesnvramup处理字符串中的相关信息首先考虑使用正则表达式。 但正则表达式常常让人头疼,在面对复杂的匹配要求时,对使用者的熟练程度要求很高。

使用textfsm模板分析输出信息后,可以将回显信息组织为json格式,以便于在python中处理。

{ ‘ intf ‘ : ‘千兆以太网1 ‘,’ ipaddr’: ‘192.168.0.77 ‘,’ status’: ‘up ‘,’ proto ‘ : ‘ ‘ proto’: ‘up’ } ‘ ‘,{ ‘ intf ‘ : ‘千兆以太网3 ‘ status ‘ : ‘ administrativelydown ‘,’ proto ‘ : ‘, ‘ IP addr ‘ 3360 ‘2’ ‘ proto ‘ : ‘ up ‘ ‘但是,只使用textfsm,面对不同制造商、不同操作系统的回波信息,我们都要手工制作模板此时,需要一组模板将各种设备的回波信息转换为python容易处理的数据格式(XML、JSON、YAML )。 这三种数据格式的介绍值得参考。

3359 blog.csdn.net/tushanpeipei/article/details/116883378? spm=1001.2014.3001.5501

ntc-templates概述: ntc-templates作为文本FSM的模板集,支持大多数主要制造商,特别是Cisco的设备。 当前的ntc-templates模板如下。

遗憾的是,ntc-templates目前只支持四个华为设备模板。

测试:实验目的:

在netmikotextfsmntc-templates中,设备接口获取UP信息,并获取OSPF路由信息。

实验环境:

有两个配置了SSH的CSR1000v,IP地址分别为192.168.0.66和192.168.0.77。

33558www.Sina.com/netmiko、textfsm和ntc-templates安装

netmiko和textfsm直接用pip3安装即可。

ntc-templates的安装步骤如下。

在根目录下创建一个ntc-template目录,导航到您创建的ntc-template文件夹下,然后运行以下命令下载ntc-template.git文件:

git clone https://github.com/networktocode/NTC-templates.git设置便于netmiko调用模板的环境变量。

export net _ text FSM=’/NTC-template/NTC-templates

/templates’

注意:ntc-templates不能直接在windows下使用。

步骤二: 使用netmiko&textfsm&ntc-templates将路由器show相关信息转换为json字符串格式,方便后续分析:

from netmiko import ConnectHandlerimport jsonCSR1 = { ‘device_type’: ‘cisco_ios’, ‘ip’: ‘192.168.0.66’, ‘username’: ‘prin’, ‘password’: ‘Cisc0123’,}CSR2 = { ‘device_type’: ‘cisco_ios’, ‘ip’: ‘192.168.0.77’, ‘username’: ‘prin’, ‘password’: ‘Cisc0123’,}CSR_Group = [CSR1, CSR2]for device in CSR_Group: # 避免有连接不上的设备,使用异常处理机制 try: # 依次连接每一个设备 connect = ConnectHandler(**device) # 通过textfsm模板对接口信息进行分析 interfaces = connect.send_command(‘show ip int brief’, use_textfsm=True) print(json.dumps(interfaces, indent=2)) # 通过textfsm模板对路由条目进行分析 route = connect.send_command(‘show ip route’, use_textfsm=True) print(json.dumps(route, indent=2)) except Exception as e: print(e)

测试结果如下(部分截图):

步骤三: 根据打印出的json字符串,组织分析字典信息,得到需要的接口和路由信息:

from netmiko import ConnectHandlerimport jsonCSR1 = { ‘device_type’: ‘cisco_ios’, ‘ip’: ‘192.168.0.66’, ‘username’: ‘prin’, ‘password’: ‘Cisc0123’,}CSR2 = { ‘device_type’: ‘cisco_ios’, ‘ip’: ‘192.168.0.77’, ‘username’: ‘prin’, ‘password’: ‘Cisc0123’,}CSR_Group = [CSR1, CSR2]for device in CSR_Group: # 避免有连接不上的设备,使用异常处理机制 try: # 依次连接每一个设备 connect = ConnectHandler(**device) print(‘*’ * 50, f”{device[‘ip’]}状态为UP的接口”, ‘*’ * 50) # 通过textfsm模板对接口信息进行分析 interfaces = connect.send_command(‘show ip int brief’, use_textfsm=True) # print(json.dumps(interfaces, indent=2)) # 根据打印出的json格式信息,输出状态是UP的接口。每个interface是一个字典。 for interface in interfaces: if interface[“status”] == ‘up’: print(f'{interface[“intf”]} is up! IP address: {interface[“ipaddr”]}’) # 通过textfsm模板对路由条目进行分析 print(‘*’ * 50, f”{device[‘ip’]}OSPF的路由信息”, ‘*’ * 50) route = connect.send_command(‘show ip route’, use_textfsm=True) # print(json.dumps(route, indent=2)) # 根据打印出的json格式信息,输出是OSPF的路由信息 for ospf_route in route: if ospf_route[‘protocol’] == (‘O’ or ‘IA’ or ‘N1’ or ‘N2’ or ‘E1’ or ‘E2’): print( f”OSPF路由:network {ospf_route[‘network’]}/mask {ospf_route[‘mask’]} nexthop_ip {ospf_route[‘nexthop_ip’]}”) except Exception as e: print(e)

测试结果:

参考资料来源:
《网络工程师的python之路》:https://www.zhihu.com/people/wang-yin-31-84/posts?page=2
NetDevOps加油站:https://zhuanlan.zhihu.com/p/163534748