ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

H3C模拟器HCL练Netconf:环境搭建与Python实战指南

H3C模拟器HCL练Netconf:环境搭建与Python实战指南 去年有段时间我天天半夜在机房加班原因不复杂40多台交换机的接口描述要统一改。一开始还老老实实SSH进去一台一台敲改到第10台就开始后悔当初没早点学网络自动化。后来我把H3C这套环境搬到模拟器里用Netconf重新走了一遍发现这个练法比真机还舒服坏了就重置一点心理负担都没有。这篇文章就是我基于H3C官方模拟器HCL做Netconf基础准备与练习的完整记录内容包括环境搭建、协议原理、Python脚本实操和我在练习里踩过的坑。适合两类人一是想把网络自动化落到实处的网工二是刚接触Netconf但手头没有真机的运维同学。1. 为什么选H3C模拟器练Netconf1.1 真机成本高模拟器反而更接近实战Netconf这个词听起来像某个高端网络管理系统实际上它就是RFC 6241定义的一个网络配置协议核心思路是用XML格式的数据通过网络设备上开放的830端口对设备做“增删改查”。它和SSH命令行最大的区别在于命令行是人看的Netconf是机器看的。你用命令行敲一百行脚本可能还要花时间解析回显文本用Netconf直接拿到结构化XML数据程序一读就懂批量操作和报送都方便得多。那为什么拿H3C模拟器来练最直接的原因是成本。一台支持Netconf的H3C真机至少几千块还不一定随时有空闲设备给你折腾。HCL是H3C官方免费的模拟器能模拟V7系列交换机、路由器本身就带Netconf服务能力。你在模拟器里随便改配置、把设备搞崩了重置一下就好在实际设备上可不敢这么玩。而且Netconf在模拟器和真机上的底层逻辑基本一致都是走SSH通道再协商能力差别只在性能和部分YANG节点的完整度。把模拟器练熟了到真机上只是换一个IP的事。我在练习过程里的体会是模拟器练Netconf最值的地方不是“免费”而是“可复现”。同一个练习今天跑通了明天删掉环境重新搭一遍能发现很多你以为懂了其实没懂的地方。这种反复横跳式的练习在真机上很难做因为环境不可控但在模拟器里重置设备三分钟完成非常适合把协议细节吃透。1.2 学Netconf前先补什么课很多人一听说Netconf就直接去查Python文档结果折腾半天连连接都建不上原因不是代码问题而是缺了基础课。以我的经验动手之前最少要过这几关第一是XML基础。Netconf传的数据全是XML你得能看懂标签的嵌套关系知道什么是元素、什么是属性、什么是命名空间namespace。不需要多深能看懂下面这段就够了rpc xmlnsurn:ietf:params:xml:ns:netconf:base:1.0 get-config sourcerunning//source /get-config /rpc要是看到这种结构觉得头皮发麻建议先花一小时过一遍XML语法再回来。第二是SSH原理。Netconf-over-SSH是RFC 6242定义的传输方式设备上的830端口本质上是一个SSH子系统。你得知道Netconf建立连接的时候是先走SSH认证的也就是说设备上必须配置好SSH用户和密码Netconf才能真正用起来。第三是Python基础。不需要会写复杂的类但至少要会安装第三方库、能读懂基本的连接代码、能把返回的XML打印出来。第四是H3C命令行基础。你得会进系统视图、给接口配IP、查看当前配置。模拟器里这些操作和在真机上几乎一样练起来也快。这四条不用全部精通再动手但至少要能看懂。我见过不少人一上来就卡在“设备上怎么开Netconf服务”这一步就是因为对设备命令行不熟。我的建议是先把HCL里的交换机当普通交换机玩两天把接口配通、能ping通物理机再往下走Netconf的部分。2. 环境准备把HCL跑起来再说2.1 HCL安装与拓扑搭建HCL全称是H3C Cloud Lab官方下载安装包之后一路下一步安装就行。需要注意两个点一是安装路径尽量别带中文和空格二是安装完后以管理员身份运行。因为HCL底层要调用VirtualBox创建虚拟机普通权限经常遇到各种诡异报错。安装好之后在设备列表里挑一台交换机我用的是S5820V2。把设备拖到拓扑面板上再加一条“虚拟网卡”的连线。HCL默认会创建一张Host-Only类型的虚拟网卡给物理机和模拟交换机提供一个独立网段。我测试的时候物理机网卡IP自动分配成了192.168.56.1模拟交换机的管理地址就计划配成192.168.56.10。拓扑搭好之后先不急着接Netconf先把设备启动起来确认能从物理机ping通设备。我在HCL里的习惯是给交换机先配置一个VLAN虚接口地址命令大概是这样system-view interface vlan-interface 1 ip address 192.168.56.10 255.255.255.0 quit这里要注意HCL模拟器启动设备比较慢别刚点完启动就急着ping我通常等两三分钟等控制台窗口出现稳定回显再操作。如果系统提示设备启动失败先别慌这台模拟器本身对Windows系统版本、CPU虚拟化都有要求具体排查方法后面第5章单独说。2.2 给模拟交换机开Netconf服务设备能ping通了接下来就是给设备“开门”让Netconf能进来。H3C设备上Netconf-over-SSH的服务开启命令我用的版本是netconf ssh server enable不同版本的H3C设备命令可能写成netconf server enable具体以你模拟器里的实际提示为准输入netconf ?就能看到当前支持的关键字。只开了Netconf还不够因为Netconf要走SSH通道所以设备上必须把SSH服务也打开同时创建一个本地用户。我在HCL里的完整配置大概是ssh server enable local-user admin class manage password simple admin123 service-type ssh authorization-attribute user-role network-admin这几行的意思是开启SSH服务创建用户admin并设置密码admin123允许SSH登录授予网络管理员角色。做完之后一定要记得在用户视图下执行save force保存配置否则模拟器一重启刚才配的全白干。这样一个“能SSH登录、能跑Netconf”的设备就准备好了。我的习惯是先在本机用命令行SSH试一下能不能登录设备确认用户名密码没问题再继续写Python脚本。这一步看起来很笨但它能把“设备配置问题”和“程序问题”快速隔离省得后面抓瞎。2.3 Python环境与ncclientPython环境这块没什么特别我用的是Python 3.10。强烈建议用venv虚拟环境别把包装到全局因为后面你可能会装paramiko、xmltodict、netmiko这些库版本之间容易互相干扰。创建虚拟环境并安装ncclient的命令是python -m venv netconf_lab netconf_lab\Scripts\activate pip install ncclientncclient是Python生态里最有名的Netconf客户端库它帮你封装了TCP连接、SSH通道、XML报文的组装和解析你不用事无巨细手工拼XML只要调用connect()、get_config()这些方法就行。装好之后可以顺手看下版本pip show ncclient之所以选ncclient而不是自己用paramiko手工发XML是因为Netconf协议本身有严格的报文格式和消息序号要求自己写很容易漏掉细节。ncclient相当于把协议规范里最容易出错的部分都处理好了你只需要关心业务数据本身。这和我前面说的“先理解原理”并不矛盾库帮你封装的是协议交互细节但你仍然要知道底层发了什么否则报错的时候看不懂。3. Netconf核心原理先弄懂再动手3.1 一次会话建立与能力协商Netconf的整个交互过程可以拆成四步建立连接、能力协商、发送RPC、收到回复。我第一次看RFC 6241的时候觉得特别抽象后来画了个简单的流程才真正记住。第一步客户端发起SSH连接目标是设备的830端口。第二步双方互相发送hello消息各自列出自己支持的能力这个过程叫能力协商。你可以在hello消息里看到类似urn:ietf:params:netconf:capability:1.0这样的字符串这表示设备支持Netconf 1.0版本。第三步客户端发送RPC请求比如get-config、edit-config。第四步设备执行操作返回rpc-reply成功时里面有ok/失败时里面有rpc-error。为什么Netconf要设计能力协商这一步我理解的是为了兼容性。不同厂商设备的Netconf实现有一些差异通过hello消息互相告知能力双方才知道后面要怎么对话。H3C设备在hello消息里除了标准能力还会列出私有能力这其实是在提示你我们家的YANG模型和命名空间跟标准的不完全一样你得用我们家的规则。我练的时候有个习惯第一次连上设备后先用ncclient打印返回的hello消息把里面的capabilities逐个看一遍。这能帮你确认当前设备支持的协议版本和扩展能力后面遇到“操作不支持”之类的报错时回来翻这个列表基本能找到答案。3.2 YANG模型Netconf的“接口说明书”Netconf操作的对象是配置数据但这些数据长什么样由YANG模型来定义。YANG是RFC 7950定义的一种数据建模语言你可以把它理解成“接口说明书”它规定了一台设备有哪些接口、接口有哪些属性、这些属性叫什么名字、是字符串还是数字甚至默认值是什么。H3C的YANG模型是厂商私有的文档在官网的“NETCONF XML API”搜索能得到里面会详细列出各个数据节点的路径和命名空间。H3C设备常见的顶层节点是top下面有Ifmgr接口管理、System系统管理、Routing路由管理等模块。以我做的接口描述为例完整路径是top/Ifmgr/Interfaces/Interface/Name top/Ifmgr/Interfaces/Interface/Description这里有个设置H3C设备在读取数据get和修改数据edit时使用的命名空间不同。读取数据的filter里用的命名空间是http://www.h3c.com/netconf/data:1.0写入配置时用的命名空间是http://www.h3c.com/netconf/config:1.0。这是我练习时踩得最深的一个坑后面会有专门篇幅说明。如果你觉得自己查文档太麻烦也有个土办法先用ncclient执行一次不带filter的get_config把设备全部配置拉下来然后从返回的XML里找你要操作的节点路径。这个方法在HCL模拟器上特别好用因为返回的数据量也不大还能顺便验证设备对哪些节点有实际支持。3.3 手动构造RPC包理解底层流程虽然ncclient帮我们封装好了请求但我强烈建议你至少手动看一眼RPC报文长什么样。以读取接口配置为例Netconf层发送的实际上是这么个XMLrpc xmlnsurn:ietf:params:xml:ns:netconf:base:1.0 message-id101 get-config sourcerunning//source filter typesubtree top xmlnshttp://www.h3c.com/netconf/data:1.0 Ifmgr Interfaces Interface NameGigabitEthernet1/0/1/Name /Interface /Interfaces /Ifmgr /top /filter /get-config /rpc注意外层rpc节点的命名空间是Netconf标准统一规定的message-id是每次请求的消息序号用来配对请求和响应。filter里的内容才是具体要查的数据这里指定只查GigabitEthernet1/0/1这个接口。为什么要花时间看这个报文因为你用ncclient操作时如果遇到错误错误信息里通常是设备的rpc-error里面会直接告诉你哪个节点有问题、哪个命名空间不对。你要是没见过标准RPC长什么样这些报错对你来说就是天书。反过来你手动拼接过一次XML再回头看ncclient的报错一眼就能定位问题。4. Python实操连接、读取、修改4.1 ncclient连接参数逐个拆解万事俱备可以写代码了。我用ncclient连接HCL模拟器的最简脚本如下from ncclient import manager with manager.connect( host192.168.56.10, port830, usernameadmin, passwordadmin123, hostkey_verifyFalse, device_params{name: h3c}, timeout10 ) as m: print(m.connected)这里每个参数我都解释一下因为它们在真机上和模拟器上的取舍不一样。host和port不用多说端口是Netconf标准规定的830不是SSH的22。username和password就是前面在设备上创建的本地用户。hostkey_verifyFalse表示不校验SSH主机密钥真机上建议保持默认的校验逻辑或者提前把主机密钥加入known_hosts在模拟器里直接关掉省去第一次连接交互确认的麻烦。device_params这个参数比较关键它告诉ncclient用哪个厂商的设备处理器来适配h3c是ncclient里对H3C设备的适配名。如果你安装的ncclient版本不支持h3c这个名称连接时会直接报错提示不支持的设备参数这时候把device_params里的name改成default再试。timeout是超时时间HCL设备启动慢首次连接可能稍微多几秒我给10秒保险。4.2 读取接口配置的完整脚本连接建立之后第一次实验建议从读取配置开始因为这条路径最简单也最能验证环境是否真的通了。我用的完整脚本from ncclient import manager import xml.dom.minidom as minidom filter top xmlnshttp://www.h3c.com/netconf/data:1.0 Ifmgr Interfaces Interface NameGigabitEthernet1/0/1/Name /Interface /Interfaces /Ifmgr /top with manager.connect( host192.168.56.10, port830, usernameadmin, passwordadmin123, hostkey_verifyFalse, device_params{name: h3c}, timeout10 ) as m: result m.get_config(sourcerunning, filter(subtree, filter)) print(minidom.parseString(result.xml).toprettyxml())运行成功的话你会看到类似下面的输出rpc-reply xmlnsurn:ietf:params:xml:ns:netconf:base:1.0 message-id1 data top xmlnshttp://www.h3c.com/netconf/data:1.0 Ifmgr Interfaces Interface NameGigabitEthernet1/0/1/Name Descriptionnetconf-lab-test/Description /Interface /Interfaces /Ifmgr /top /data /rpc-replyget_config的sourcerunning表示读取运行配置filter用subtree类型表示按数据树过滤。我习惯把返回的XML用minidom格式化打印主要是为了人眼看得清楚。这一步跑通了说明你的模拟器Netconf服务、SSH用户、Python客户端全部打通后面的各种操作都是在重复这个链路。如果你运行后发现result非常长把整台设备的配置都拉回来了说明filter没生效。大概率是命名空间或者节点路径写得不对H3C设备在filter匹配不上的时候不会报错而是直接返回空数据或者顶层全量数据这个坑需要特别注意。4.3 修改接口描述edit_config实操读取没问题就可以尝试修改配置了。我选的第一个目标是给接口GigabitEthernet1/0/1加一条描述文字相当于模拟真实环境里批量修改接口备注的场景。脚本主体如下config top xmlnshttp://www.h3c.com/netconf/config:1.0 Ifmgr Interfaces Interface NameGigabitEthernet1/0/1/Name Descriptionnetconf-lab-test/Description /Interface /Interfaces /Ifmgr /top with manager.connect( host192.168.56.10, port830, usernameadmin, passwordadmin123, hostkey_verifyFalse, device_params{name: h3c}, timeout10 ) as m: result m.edit_config(targetrunning, configconfig) print(result.xml)注意这里与读取时的最大区别config里默认命名空间从data:1.0换成了config:1.0因为你要写的是配置不是查数据。如果还是用data:1.0设备会返回invalid-value之类的错误。执行成功后返回的rpc-reply里应该有ok/。这时候不要急着高兴我每次都会回到HCL控制台执行一步验证display current-configuration interface GigabitEthernet1/0/1看到接口下出现description netconf-lab-test才算整个闭环跑通。还有一个经验edit_config默认操作是merge意思是把提供的配置融合进现有配置里所以如果你要删除一条配置需要显式把值设成空字符串或者用operationremove来操作。H3C设备在模拟器上对删除操作的响应跟真机不完全一样练习的时候可以用operationremove试一下但别指望模拟器对每个节点的删除语义都和真机一致。5. 常见问题与排查方法5.1 HCL设备启动失败HCL设备启动失败可能是大家在模拟器阶段遇到最多的拦路虎。我遇到的情况包括点启动之后设备一直停留在启动中、控制台没有响应、VirtualBox报错虚拟机启动失败。排查顺序我建议是这样第一确认Windows的虚拟化功能是否开启。打开任务管理器-性能-虚拟化如果显示“已禁用”必须进BIOS开启Intel VT-x或者AMD-V。第二HCL安装目录和用户名的路径尽量避免中文VirtualBox对中文路径的兼容性真的很差。第三以管理员身份运行HCL这能解决大量莫名其妙的权限问题。第四如果机器上同时装了Docker Desktop、Hyper-V可能会和VirtualBox冲突可以临时关闭Hyper-V再启动HCL。第五实在不行就重装VirtualBox注意版本要匹配HCL依赖的版本别随手装最新版。我自己的机器上遇到的是Hyper-V冲突问题关掉之后HCL设备秒启动。这个问题网上讨论很多但每个人的环境组合都不一样所以排查思路比单一结论更重要。5.2 端口不通、连接被拒设备启动成功了Python脚本却报连接超时或者Connection refused。这时候先别改代码直接用socket测试一下端口通不通import socket s socket.create_connection((192.168.56.10, 830), timeout3) s.close() print(830端口通了)如果端口不通按这个顺序排查第一设备是不是真的起来了到HCL控制台看有没有回显。第二设备IP地址是不是真的配到了接口上在控制台执行display ip interface brief确认。第三Windows防火墙是不是拦了830HCL的虚拟网卡一般不会触发防火墙但为了排除可以先临时关闭防火墙测试。第四netconf ssh server enable这条配置是不是还在模拟器重置之后经常丢失配置。如果socket能连上但ncclient仍然报错重点看报错里有没有Authentication failed有就检查用户名密码和SSH用户的配置有Unsupported device_params就按之前说的把device_params改成default。5.3 filter里的namespace写错这个坑我在前面中提到过但值得单独说因为我身边好几个同事都栽在这里。症状是get_config请求不报错但返回的data部分要么是空的要么特别长。H3C设备对读取和修改分别使用不同的命名空间操作类型命名空间get / get-config 读取http://www.h3c.com/netconf/data:1.0edit-config 修改http://www.h3c.com/netconf/config:1.0我当时在练习里把读取配置的filter也写成了config:1.0结果设备直接返回一段空配置。后来我索性先用不带filter的get_config()把设备全部配置拉下来确认数据节点路径再往filter里套这样就不容易出错。另外注意Interface下的Name节点这个节点虽然是字符串类型但H3C设备在模拟器上对它的大小写十分敏感。写成gigabitethernet1/0/1、GigabitEthernet 1/0/1都会导致匹配失败必须和命令行风格一致写成GigabitEthernet1/0/1。这种细节不实际踩一遍根本想不到。5.4 edit_config报错与回滚edit_config报错比较常见的是返回rpc-error error-tagoperation-failed/error-tag error-message.../error-message /rpc-error看error-message的内容H3C设备会给出比较明确的提示。我遇到过的几种情况一是指定的接口名不存在二是值不合法比如Description超长三是模拟器对某个YANG节点只支持读取不支持写入。这里必须强调一个运维上的重要概念Netconf的edit_config默认不是事务性的。如果一次操作里包含多个节点的修改有一部分成功、有一部分失败设备不会自动把成功的部分回滚。所以我练成的一个习惯是在跑批量修改脚本之前先用get_config把要改的节点原始值导出保存一份万一改坏了再通过edit_config把原始值写回去。在HCL模拟器里实在改不回来了就直接重置设备但在真机上你只能靠备份和回滚方案救命。我还测过一个场景给接口Description设置空字符串H3C模拟器的行为是删除这条描述。这个行为不同设备版本可能有差异真机上我一般用标准的Description/加上operationremove来显式删除语义更清晰。6. 实操心得与下一步延伸6.1 让练习效率翻倍的几个习惯模拟器是很宽容的学习环境但如果不注意方法也很容易变成“配一遍忘了改一遍又忘了”。我自己练习下来有几个让效率明显提升的习惯。第一个习惯是“先CLI后Netconf”。每次想用Netconf操作一个功能先在设备命令行手动改一遍再对照命令行配置去看Netconf返回的XML结构。这样当你写filter的时候脑子里能快速对应到你需要操作的配置路径而不是盲目去猜YANG节点。第二个习惯是“每个脚本只干一件事”。初学的时候我总想把连接、读取、修改、打印写在一个脚本里看着很酷但调试麻烦。后来拆成三个独立脚本连接测试、读取配置、修改配置。出了问题单独跑一个环节就能定位不用整段翻。第三个习惯是“做完一步就验证一步”。HCL控制台就摆在旁边每次执行完Python脚本立刻去控制台用display命令验证结果。Netconf的好处是结构化但如果你偷懒不验证跑通一次就以为懂了等到真机上遇到返回结果和预期不一致就会很被动。第四个习惯是“善用打印XML”。ncclient返回的result.xml是排查问题的第一手资料别只盯着True或False看。把XML完整打印出来即使现在看不懂看多了就能建立起对Netconf响应结构的直觉。6.2 练完Netconf还能往哪走当你把基础连接、get_config、edit_config都跑通之后接下来有几个很自然的练习方向每一个都比单纯会敲Netconf命令更有价值。第一个方向是批量巡检。把第4章的脚本改造成读取所有接口状态输出接口IP、状态、描述然后做成一个小工具模拟“早上检查全网设备运行状态”的场景。这个练习可以直接用HCL里加几台设备来做一台一台循环连接把结果汇总成表格。第二个方向是配置模板化。把要下发的配置抽成XML模板配合Python的字符串格式化或者Jinja2模板引擎批量生成不同接口的配置数据再通过Netconf下发。这就是自动化运维里“模板数据”思想的最初形态。第三个方向是接触标准模型。H3C私有YANG模型很好使但真实场景里你可能会遇到多厂商设备。可以试着了解OpenConfig这样的标准YANG模型看看同一份配置是怎么用标准化节点表达的。这个方向不一定要在HCL上操作但理解它之后再看Netconf的跨平台价值会清晰很多。第四个方向是探索Telemetry。Netconf是“拉”数据Telemetry是设备主动“推”数据两者都属于网络自动化体系。练完Netconf再学Telemetry你会发现能力协商、数据模型、订阅这些概念都是相通的学习成本会低很多。如果是在实际运维环境里下一步还可以把Netconf操作集成到自动化平台或者调度系统里但这已经超出模拟器练习的范畴了等你在HCL上把闭环跑通自然知道该往哪个方向加东西。最后说点个人体会。我刚开始练的时候总想着把RFC 6241整本读完再动手结果拖了两周。后来换了个打法先在模拟器里把Netconf服务打开用ncclient写一个get_config哪怕只读出接口IP都算通关然后再去补协议细节。我和同事聊过这件事大家普遍的感受是跑通一次成功会话带来的进步远大于看十篇协议解析。如果你也准备入门网络自动化我建议你别犹豫今晚就打开HCL把环境准备好然后照着这篇文章跑一遍跑不通的地方再回来看原理部分基本就能串联起来了。
返回列表