MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

玩转网络自动化之ncclient模块(nornir网络自动化)

2025-02-04 14:15 huorong 精选文章 5 ℃ 0 评论

在之前的玩转网络自动化的文章中我们介绍的都是通过命令行来操作设备的模块。但在SDN网络及运维自动化发展浪潮下,通过命令行来操作设备越来越显得效率低下,同时自动化的开发需要针对不同厂商不同型号设备的命令行逐个适配,增加了开发的工作量与复杂度。

这时netconf(Network Configuration Protocol,网络配置协议)协议横空出世,它是一种基于XML 的网络管理协,提供了一种可编程的、对网络设备进行配置和管理的方法。今天为大家带来一款基于netconf协议配置设备的python模块ncclient,在了解这个模块使用前,我们先来了解一下netconf协议的基本原理。

01 Netconf协议介绍

(1)Netconf协议结构

NETCONF 协议采用分层结构,分为内容层(Content)、操作层(Operations)、RPC(Remote

Procedure Call,远程调用)层和通信协议层(Transport Protocol),具体如下表:

(2)Netconf协议设备配置流程

使用Netconf配置设备主要过程如下:

02 ncclient模块介绍

ncclient是一个Python库,可促进围绕NETCONF协议的客户端脚本编写和应用程序开发。ncclient由Shikar Bhushan开发,目前支持世界主流网络设备厂商,具体如下(注意下device_params与品牌映射的值后面模块的使用需要传递该参数):

1. Juniper: device_params={'name':'junos'}  
2.   
3. Cisco:  
4. CSR: device_params={'name':'csr'}  
5. Nexus: device_params={'name':'nexus'}  
6. IOS XR: device_params={'name':'iosxr'}  
7. IOS XE: device_params={'name':'iosxe'}  
8.   
9. Huawei:  
10. device_params={'name':'huawei'}  
11. device_params={'name':'huaweiyang'}  
12.   
13. Alcatel Lucent: device_params={'name':'alu'}  
14.   
15. H3C: device_params={'name':'h3c'}  
16. HP Comware: device_params={'name':'hpcomware'}  
17.   
18. Server or anything not in above: device_params={'name':'default'}  

03 ncclient模块安装

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

这边有个注意点如果你是python3环境在安装ncclient模块时会自动安装最新的paramiko 2.7.2的版本,ncclient模块在调用这个版本的paramiko进行SSH会话建立时会报"Bad auth type"的错,推荐大家安装paramiko 2.6.0的版本。

04 ncclient使用

我们先来看一个ncclient的小示例通过get方法获取H3C设备的LLDP邻居,具体代码如下:

1. #!/usr/bin/env/ python  
2. # -*- coding:utf-8 -*-  
3.   
4. from ncclient import manager  
5. from xml.dom.minidom import parseString  
6.   
7. #H3C设备获取设备LLDP邻居信息,这边的XML内容可以根据厂商的Netconf接口文档进行查询  
8. lldp_xml = ''''' 
9. <top xmlns="http://www.h3c.com/netconf/data:1.0"> 
10. <LLDP> 
11. <NbManageAddresses> 
12. <ManageAddress> 
13. <TimeMark></TimeMark> 
14. <IfIndex></IfIndex> 
15. <AgentID></AgentID> 
16. <NeighborIndex></NeighborIndex> 
17. <SubType></SubType> 
18. <Address></Address> 
19. <InterfaceType></InterfaceType> 
20. <InterfaceID></InterfaceID> 
21. </ManageAddress> 
22. </NbManageAddresses> 
23. </LLDP> 
24.  </top>     
25. '''  
26.   
27. if __name__ == "__main__":  
28.     args = dict(  
29.         host="10.1.1.1",  
30.         username="admin",  
31.         password="admin",  
32.         device_params={"name": "h3c"},  
33.         hostkey_verify=False  
34.     )  
35.   
36.     #建立netconf连接  
37.     with manager.connect(**args) as c:  
38.         #get用来获取数据,包括运行状态数据和配置数据  
39.         data = c.get(filter=("subtree", lldp_xml))  
40.         #将返回的xml对象解析成字符串  
41.         xml_data = parseString(data.xml).toprettyxml()  
42.         print(xml_data)  

运行结果如下:

1. D:\env\python3_env\Scripts\python3.exe E:/it_code/ncclient_test.py  
2. <?xml version="1.0" ?>  
3. <rpc-reply message-id="urn:uuid:52127664-61c5-4e0b-a370-ecc3fb45e82a" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> //netconf的每条消息都有一个message-id用于标识消息的唯一性  
4.     <data>  
5.         <top xmlns="http://www.h3c.com/netconf/data:1.0"> //xmlns后面跟的是协议命名空间每个厂商都有自己的命名空间  
6.             <LLDP>  
7.                 <NbManageAddresses>  
8.                     <ManageAddress>  
9.                         <TimeMark>14322</TimeMark>  
10.                         <IfIndex>45</IfIndex>  
11.                         <AgentID>1</AgentID>  
12.                         <NeighborIndex>1</NeighborIndex>  
13.                         <SubType>1</SubType>  
14.                         <Address>DAAAAQ==</Address>  
15.                         <InterfaceType>2</InterfaceType>  
16.                         <InterfaceID>1</InterfaceID>  
17.                     </ManageAddress>  
18.                     <ManageAddress>  
19.                         <TimeMark>24642</TimeMark>  
20.                         <IfIndex>46</IfIndex>  
21.                         <AgentID>1</AgentID>  
22.                         <NeighborIndex>1</NeighborIndex>  
23.                         <SubType>1</SubType>  
24.                         <Address>AQEBAg==</Address>  
25.                         <InterfaceType>2</InterfaceType>  
26.                         <InterfaceID>46</InterfaceID>  
27.                     </ManageAddress>  
28.                     <ManageAddress>  
29.                         <TimeMark>24642</TimeMark>  
30.                         <IfIndex>47</IfIndex>  
31.                         <AgentID>1</AgentID>  
32.                         <NeighborIndex>1</NeighborIndex>  
33.                         <SubType>6</SubType>  
34.                         <Address>QHep55YI</Address>  
35.                         <InterfaceType>2</InterfaceType>  
36.                         <InterfaceID>0</InterfaceID>  
37.                     </ManageAddress>  
38.                     <ManageAddress>  
39.                         <TimeMark>24643</TimeMark>  
40.                         <IfIndex>48</IfIndex>  
41.                         <AgentID>1</AgentID>  
42.                         <NeighborIndex>1</NeighborIndex>  
43.                         <SubType>6</SubType>  
44.                         <Address>QHep55YJ</Address>  
45.                         <InterfaceType>2</InterfaceType>  
46.                         <InterfaceID>0</InterfaceID>  
47.                     </ManageAddress>  
48.                 </NbManageAddresses>  
49.             </LLDP>  
50.         </top>  
51.     </data>  
52. </rpc-reply>  
53.   
54.   
55. Process finished with exit code 0 

通过上面示例是不是发现通过ncclient获取数据非常方便,再也不用对半格式化的文本进行简析了,下面我们列举一些ncclient常用的操作方法及用途,具体如下表:

下面我们通过edit_config方法来演示一下怎么进行配置下发,我们通过edit_config方法来创建一个设备账户,具体示例如下:

1. #!/usr/bin/env/ python  
2. # -*- coding:utf-8 -*-  
3.   
4. from ncclient import manager  
5. from xml.dom.minidom import parseString  
6. from ncclient.operations.rpc import RPC  
7. from ncclient.xml_ import *  
8.   
9. #给设备创建一个test账号,这边要注意报文与get报文的区别,配置报文需要在top外层再加个config标签  
10. #同时在config标签中要标注xmlns空间命名  
11. account_xml = ''''' 
12. <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
13. <top xmlns="http://www.h3c.com/netconf/config:1.0"> 
14. <UserAccounts> 
15. <Management> 
16. <Accounts> 
17. <Account> 
18. <Name>test</Name> 
19. <Password>test123</Password> 
20. <FTP>true</FTP> 
21. <HTTP>true</HTTP> 
22. <HTTPS>true</HTTPS> 
23. <SSH>true</SSH> 
24. <Terminal>true</Terminal> 
25. </Account> 
26. </Accounts> 
27. </Management> 
28. </UserAccounts> 
29. </top> 
30. </config> 
31. '''  
32.   
33. if __name__ == "__main__":  
34.     args = dict(  
35.         host="10.1.1.1",  
36.         username="admin",  
37.         password="admin",  
38.         device_params={"name": "h3c"},  
39.         hostkey_verify=False  
40.     )  
41.   
42.     #建立netconf连接  
43.     with manager.connect(**args) as c:  
44.         #通过edit_config下发设备配置,target指定修改running-config的配置, default_operation指定操作方式,  
45.         #error_option指定遇到配置错误进行回退  
46.         data = c.edit_config(target='running', config=account_xml,  
47.                              default_operation='merge', error_option='rollback-on-error')  
48.         #将返回的xml对象解析成字符串  
49.         xml_data = parseString(data.xml).toprettyxml()  
50.         print(xml_data)  

执行结果如下,返回内容中有"ok"字符就表示下发成功了。

1. D:\env\python3_env\Scripts\python3.exe E:/it_code/ncclient_test.py  
2. <?xml version="1.0" ?>  
3. <rpc-reply message-id="urn:uuid:0b8f53b5-03b3-45f6-9da9-99c5aaa5e35b" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">  
4.     <ok/>  
5. </rpc-reply>  
6.   
7.   
8. Process finished with exit code 0  

ncclient模块我们今天就先讲到这,有什么问题都在下方留言。如果大家喜欢不要忘了关注、点赞、转发哦!

--END--

@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。

相关推荐文章:

Tags:ncftp

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言