专业的编程技术博客社区

网站首页 > 博客文章 正文

玩转网络自动化之ntc_templates模块

baijin 2024-10-31 12:19:23 博客文章 9 ℃ 0 评论

我们之前的文章介绍了通过TextFSM模块来解析半格式化的文本数据,这边肯定有观众老爷会问:"我们自己写TextFSM模板太累了,有没有现成的简析模板可以拿过来用?",哈哈,答案是肯定的!ntc-templates模块就帮我们实现了这个功能,今天我们就一起来学习一下这个模块吧。

1、 模块介绍

ntc-templates模块是网络设备的TextFSM模板的存储库,它包含了400多个TextFSM解析模板,覆盖了世界上主流的网络设备(Cisco、Juniper、Arista、H3C等),如下所示:

1. [root@ templates]# ls -l  
2. total 1660  
3. -rw-r--r-- 1 root root   700 Apr 20 06:19 alcatel_aos_show_vlan.textfsm  
4. -rw-r--r-- 1 root root   171 Apr 20 06:19 alcatel_sros_oam_mac-ping.textfsm  
5. -rw-r--r-- 1 root root   434 Apr 20 06:19 alcatel_sros_show_router_bgp_routes_vpn-ipv4.textfsm  
6. -rw-r--r-- 1 root root   544 Apr 20 06:19 alcatel_sros_show_service_id_base.textfsm  
7. -rw-r--r-- 1 root root   371 Apr 20 06:19 arista_eos_bash_df_-h.textfsm  
8. -rw-r--r-- 1 root root   430 Apr 20 06:19 arista_eos_dir_flash.textfsm  
9. -rw-r--r-- 1 root root   121 Apr 20 06:19 arista_eos_show_boot-config.textfsm  
10. -rw-r--r-- 1 root root   226 Apr 20 06:19 arista_eos_show_clock.textfsm  
11. -rw-r--r-- 1 root root   524 Apr 20 06:19 arista_eos_show_environment_cooling.textfsm  
12. -rw-r--r-- 1 root root   525 Apr 20 06:19 arista_eos_show_environment_temperature.textfsm  
13. -rw-r--r-- 1 root root   107 Apr 20 06:19 arista_eos_show_hostname.textfsm  

2、 模块安装

1. #ntc-templates模块安装非常简单,具体安装命令如下:    
2. pip install ntc_templates    
3. #如果出现'Read timed out'可以用阿里云镜像安装,具体命令如下:    
4. pip install -i https://mirrors.aliyun.com/pypi/simple/ ntc_templates  

安装好ntc_templates模块后我们可以到它的安装目录查看具体的模板信息,目录位置如下所示:

1. #ntc_templates位置  
2. [root@ templates]# pwd  
3. /usr/local/lib/python2.7/site-packages/ntc_templates/templates  
4. [root@ templates]#  

在目录中我们不难发现每个模板的命名都是由系统+命令组成,其实在该目录中存在一个index文件,该文件中我们就可以发现ntc_templates查找简析模板就是通过形参platform与command组合来映射查询的。

1. Template, Hostname, Platform, Command  
2.   
3. alcatel_aos_show_vlan.textfsm, .*, alcatel_aos, show vlan  
4.   
5. alcatel_sros_show_router_bgp_routes_vpn-ipv4.textfsm, .*, alcatel_sros, sh[[ow]] router bgp rou[[tes]] vpn-ipv4  
6. alcatel_sros_show_service_id_base.textfsm, .*, alcatel_sros, sh[[ow]] serv[[ice]] id ba[[se]]  
7. alcatel_sros_oam_mac-ping.textfsm, .*, alcatel_sros, oam mac-pi[[ng]]  
8.   
9. arista_eos_show_mac_security_participants_detail.textfsm, .*, arista_eos, sh[[ow]] ma[[c]] secu[[rity]] part[[icipants]] det[[ail]]  
10. arista_eos_show_interfaces_transceiver_detail.textfsm, .*, arista_eos, sh[[ow]] inte[[rfaces]] tr[[ansceiver]] de[[tail]]  
11. arista_eos_show_mac_security_mka_counters.textfsm, .*, arista_eos, sh[[ow]] ma[[c]] secu[[rity]] mk[[a]] count[[ers]]  
12. arista_eos_show_environment_temperature.textfsm, .*, arista_eos, sh[[ow]] en[[vironment]] t[[emperature]]  
13. arista_eos_show_interfaces_transceiver.textfsm, .*, arista_eos, sh[[ow]] inte[[rfaces]] tr[[ansceiver]]  

3、 模块使用

1) 简单使用

现在我们就来看看ntc_templates的简单使用示例吧,上代码:

1. #!/usr/bin/env/ python  
2. # -*- coding:utf-8 -*-  
3.   
4. from ntc_templates.parse import parse_output  
5.   
6. if __name__ == "__main__":  
7.     #设备板卡信息  
8.     device_info = '''  Type: S-Static   D-Dynamic   O-Openflow   R-Rule   M-Multiport  I-Invalid 
9. IP address      MAC address    VLAN/VSI   Interface/Link ID        Aging Type 
10. 10.27.248.129   70f9-6df3-ac8d --         MGE0/0/0                 892   D 
11. 10.27.248.133   9428-2eb6-d810 --         MGE0/0/0                 1152  D 
12. 10.27.248.134   001c-54ff-2800 --         MGE0/0/0                 451   D 
13. 12.1.1.2        9428-2eb6-d834 --         XGE2/0/1                 993   D 
14.     '''  
15.     #我们测试设备是H3C,这边platform值为"hp_comware",因为H3C之前有部分技术是HP的,在国际上H3C设备上好多是  
16.     #打着HP的品牌  
17.     datas = parse_output(platform='hp_comware', command='dis arp', data=device_info)  
18.     print(datas) 

代码运行结果如下:

1. [root@ ~]# python ntc_test.py  
2. [{u'macaddress': '70f9-6df3-ac8d', u'aging': '892', u'ipaddress': '10.27.248.129', u'vlan': '--', u'interface': 'MGE0/0/0', u'type': 'D'}, {u'macaddress': '9428-2eb6-d810', u'aging': '1152', u'ipaddress': '10.27.248.133', u'vlan': '--', u'interface': 'MGE0/0/0', u'type': 'D'}, {u'macaddress': '001c-54ff-2800', u'aging': '451', u'ipaddress': '10.27.248.134', u'vlan': '--', u'interface': 'MGE0/0/0', u'type': 'D'}, {u'macaddress': '9428-2eb6-d834', u'aging': '993', u'ipaddress': '12.1.1.2', u'vlan': '--', u'interface': 'XGE2/0/1', u'type': 'D'}]  
3. [root@ ~]#

由于ntc_templates的parse_out方法会调用CliTable模块来读取index文件(如下所示),CliTable模块是调用unix的相关接口所以该模块目前不能运行在windows系统上,所以我们在linux平台上进行了演示,看到这部肯定有读者问那我们只有windows系统该怎么用,其实在我们之前讲的netmiko模块就已经嵌套了ntc_template的调用,该调用跳过了CliTable的使用,所以能够支持在windows平台运行ntc_templates的解析模板,下面让我一起来看看怎么使用吧。

1. def parse_output(platform=None, command=None, data=None):  
2.     """Return the structured data based on the output from a network device."""  
3.     template_dir = _get_template_dir()  
4.     #parse_output模块调用了CliTable接口导致不能在windows平台上运行  
5.     cli_table = clitable.CliTable("index", template_dir)  
6.   
7.     attrs = {"Command": command, "Platform": platform}  
8.     try:  
9.         cli_table.ParseCmd(data, attrs)  
10.         structured_data = _clitable_to_dict(cli_table)  
11.     except clitable.CliTableError as e:  
12.         raise Exception(  
13.             'Unable to parse command "{0}" on platform {1} - {2}'.format(  
14.                 command, platform, str(e)  
15.             )  
16.         )  

2) 结合netmiko的使用

好了,现在我们看看怎么在Netmiko中使用ntc_template模块吧,代码如下所示:

1. #!/usr/bin/env/ python  
2. # -*- coding:utf-8 -*-  
3.   
4. import os  
5. from netmiko import ConnectHandler  
6.   
7. #在netmiko中要使用ntc_templates的解析模板必须要设置NET_TEXTFSM环境变量,该变量的值应该指向  
8. #ntc_templates的templates目录,为了省去设置环境变量的麻烦我们直接通过os.environ来加上需要设置的目录  
9. #这边有个坑大家注意一下,如果设置的值不加'r'会导致'\ntc_templates'这边被转义换行导致始终找到不解析模板  
10. os.environ["NET_TEXTFSM"] = r"D:\env\python3_env\Lib\site-packages\ntc_templates\templates"  
11.   
12. if __name__ == "__main__":  
13.     kwargs = {  
14.         "ip": "10.27.248.132",  
15.         "username": "suning",  
16.         "password": "suning",  
17.         "device_type": "hp_comware"  
18.     }  
19.   
20.     ins = ConnectHandler(**kwargs)  
21.     #这边在调send_command时传参设置use_textfsm为True就会自动调用ntc_templates的简析模板进行解析  
22.     print(ins.send_command("dis arp", use_textfsm=True))  

代码运行结果如下所示:

1. D:\env\python3_env\Scripts\python3.exe E:/文档/netmiko_test.py  
2. [  
3. {'ipaddress': '10.27.248.129', 'macaddress': '70f9-6df3-ac8d', 'vlan': '--', 'interface': 'MGE0/0/0', 'aging': '764', 'type': 'D'},   
4. {'ipaddress': '10.27.248.133', 'macaddress': '9428-2eb6-d810', 'vlan': '--', 'interface': 'MGE0/0/0', 'aging': '1055', 'type': 'D'},   
5. {'ipaddress': '10.27.248.134', 'macaddress': '001c-54ff-2800', 'vlan': '--', 'interface': 'MGE0/0/0', 'aging': '383', 'type': 'D'},  
6.  {'ipaddress': '12.1.1.2', 'macaddress': '9428-2eb6-d834', 'vlan': '--', 'interface': 'XGE2/0/1', 'aging': '895', 'type': 'D'}  
7. ]  
8.   
9. Process finished with exit code 0 

到此我们的ntc_template模块就讲解完毕了,结合枯燥加班狗发表的《玩转网络自动化之netmiko模块》与《玩转网络自动化之TextFSM模块》的文章,你会发现适配设备命令行的自动化之路就是这么简单,如果大家有什么问题欢迎大家在文章下面留言,最后读者老爷们不要忘了进行点击、收藏与转发哦!

--喜欢请点击@IT管理局关注哦--

本局精彩文章:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表