2026/4/18 2:20:15
网站建设
项目流程
php 怎么做视频网站,网站备案后 如何建设,wordpress粘贴文章,学校网站建设 论文呢文章目录CLI和MD-CLI是什么为什么要有MD-CLIMD-CLI和传统CLI相比有什么优势MD-CLI和YANG是如何对应的MD-CLI#xff08;Model-Driven Command Line Interface#xff09;是基于YANG模型生成的既有机机交互又有人机交互能力的命令行工具。相比传统CLI#xff0c;具有配置逻辑…文章目录CLI和MD-CLI是什么为什么要有MD-CLIMD-CLI和传统CLI相比有什么优势MD-CLI和YANG是如何对应的MD-CLIModel-Driven Command Line Interface是基于YANG模型生成的既有机机交互又有人机交互能力的命令行工具。相比传统CLI具有配置逻辑简单、机器解析处理容易和学习成本低等优点。CLI和MD-CLI是什么CLI命令行接口一种以命令行形式与设备进行交互的工具。CLICommand Line Interface即命令行接口是用户与设备进行交互的常用工具之一被广泛应用于新业务发放、日常运维等场景中。用户登录到设备出现命令行提示符后即进入命令行接口。系统向用户提供一系列命令用户可以通过命令行形式输入命令实现用户与设备的交互。CLI与Windows系统上的图形界面类似只不过CLI是文字形式而Windows的图形界面主要是可视化的形式。目前网络设备支持的命令行接口分为传统CLI和MD-CLI。MD-CLI基于YANG模型生成的命令行接口。传统CLI所使用的数据模型是不统一的这也解释了为什么类似的功能在不同设备上需要输入不同的命令行。MD-CLI的核心理念在使用YANG模型作为数据建模语言。MD-CLI为用户提供以目录形式访问YANG模型节点的方法用户在了解相关YANG模型中的节点层次结构后可以自动推导出相应的MD-CLI操作命令行反之亦然。为什么要有MD-CLI随着网络时代的飞速发展网络设备成几何级数量剧增与此同时设备厂商以及网络设备的类别也越来越多这使得网络管理任务愈发困难。在云网络时代下网络设备面临的最大转型是管理和运维的转型即由原来的单网元人机管理演进到全网自动化管理的机机管理。传统CLI作为典型的人机接口是人和设备交互的主要方式。在SNMP出现以前传统CLI脚本编写是实现网络自动化管理的主要方式。然而传统CLI不统一的命令行句式和非结构化的输出使得CLI脚本维护困难成本高昂。在这种背景下SNMP成为广泛应用于TCP/IP网络的网络管理标准协议。随着时间推进由于SNMP配置效率低不支持事务机制等问题基于YANG模型的多种网络配置协议如NETCONF、RESTCONF等应运而生。用户可以使用web端或者app通过控制器批量对设备进行管理与维护。至此网络设备管理形成了传统CLI实现单点设备配置各网络配置协议实现自动化管理的工作模式。即传统CLI作为人机接口各网络配置协议作为机机接口。在网络规模剧增的今天为了完成网络管理无论是人机接口还是机机接口都是不可或缺的。有没有一种方式既可以用作人机交互又可以作为机机交互的工具呢答案是肯定的。MD-CLI便是同时具有两种能力的新一代交互方式。与NETCONF、RESTCONF等相同MD-CLI也使用YANG模型作为数据建模语言。YANG模型定义了数据的层次化结构使得机器可以有效地对运维数据进行识别与解析。因此MD-CLI也可以被应用于网络自动化的场景中。作为机机接口MD-CLI为用户提供以目录形式访问YANG模型节点的方法相较偏向机机交互的网络配置协议更具有可读性用户不需要借助上层应用也能批量对设备进行管理与维护。作为人机接口MD-CLI只有几个基本的操作指令熟悉YANG模型的用户学习之后便可直接使用MD-CLI对设备进行单点配置不用为设备复杂多变的命令行形式而苦恼。MD-CLI的出现既方便了用户也方便了开发工作者。从用户层面讲MD-CLI省去了用户对不同厂商不同设备的多套CLI学习的过程只需要学习YANG模型。更重要的是当多种设备交互方式都统一基于YANG模型时一旦用户清楚了YANG结构后便可以根据实际场景灵活的选择更适合的设备交互方式。从开发工作者层面讲MD-CLI省去了不同CLI模型的开发而只需要专注YANG的开发大大减少了开发工作量。基于YANG模型的多种设备交互方式示意图MD-CLI和传统CLI相比有什么优势优点一简化配置逻辑传统CLI在执行每条命令时都会检查该命令操作对象的依赖关系因此在配置时需要严格遵守各条命令之间的依赖顺序。传统CLI检查依赖关系示意图MD-CLI的依赖校验是在提交阶段才执行配置过程不需要配置逻辑校验用户只需保证在提交时相关的配置依赖关系已经满足即可在编辑过程中无需严格遵守业务之间的依赖逻辑。MD-CLI检查生效示意图优点二降低学习成本在网络管理场景下用户需要学习传统CLI以便对设备按需进行单点配置。同时随着网络规模的增大用户也需要学习YANG模型以实现自动化管理。因此新手用户需要同时学习传统CLI和YANG。另外在传统CLI的学习中用户还需进一步阅读相关的手册去确认不同厂商以及不同设备的功能和命令行形式是否有不同学习过程长成本高。传统CLI场景下需求解决过程若使用MD-CLI这一过程便只需要聚焦在设备不同的YANG结构上。用户在了解设备YANG模型结构和MD-CLI的几个基本操作指令后即可导出MD-CLI的操作命令行直接对设备进行配置。如果有自动化管理的需求也可以利用MD-CLI进行脚本的编写实现多设备进行批量管理。整个学习过程省去传统CLI命令格式的学习以及对不同厂商命令行格式较大差异的识别降低了学习成本。MD-CLI场景下需求解决过程优点三利于机器解析处理传统CLI主要是面向人机交互界面强调人的可读性其命令行形式没有统一语法约定各厂商差异大。并且传统CLI命令回显是纯文本的以便人可以阅读和理解。如果想采用机器对回显结果进行解析难度就很大了。因为回显结果是非结构化的有的是表格有的是字符串应用程序没有统一的标准去解析。除非针对每一个命令的回显结果去做适配这会大大加大运维管理成本其复杂性也会影响应用程序的稳定性。以下以查看指定接口不同长度范围的报文收发统计信息来展示传统CLI的命令行输出。HUAWEI system-view [HUAWEI] display interface statistics 100ge 1/0/1 verbosePacketLength(Bytes)Send(packets)Receive(packets)1~64 0 1 65~127 183703 109222 128~255 0 0 256~511 12251 12249 512~1023 0 0 1024~1518 0 0 1519~9216 0 0MD-CLI的输出采用JSON格式遵循业务YANG的定义和相关标准结构化的信息便于使用自动化工具统一解析。它的内容层使用YANG模型很好的弥补了人机接口的不足。以下以查看当前视图下candidate数据库中的配置为例演示MD-CLI的命令行输出。[*(ex)ADMINHUAWEI]/ifm/interfaces/interface[nameMEth0/0/0] MDCLI display this candidate{name:MEth0/0/0,class:main-interface,type:MEth,number:0/0/0,description:To deviceB MEth0/0/0,admin-status:up,link-protocol:ethernet,router-type:broadcast,clear-ip-df:false, link-up-down-trap-enable: true, statistic-enable: true, statistic-mode: interface-based, mtu: 1500, spread-mtu-flag: false, vrf-name: _public_, l2-mode-enable: false, huawei-ip:ipv4:{addresses:{address:[{ip:10.1.1.255,mask:255.255.254.0,---- More ----MD-CLI和YANG是如何对应的YANG模型MD-CLI的命令是根据设备支持的YANG模型生成的。YANG模型主要节点类型包括Container容器节点Container节点用来描述若干相关节点的集合。Container节点只有子节点而没有值。对于子节点数目和类型不作要求可以是Container节点、Leaf节点、Leaf-list节点或者List节点。Leaf叶节点一个Leaf节点包含简单的数据如整形数据或字符串。该节点对每个特定类型仅有一个确定值并且没有子节点。Leaf-list叶列表节点Leaf-list列表节点是一系列具备特定类型的叶节点的集合每个叶节点对特定数据类型有一个确定值。List列表节点List节点定义了列表条目序列每个条目就像一个结构体或者一个记录实例由其关键Leaf节点的值key值唯一识别。List节点可定义多个关键Leaf节点也可能是一系列包含任意数据类型包括Leaf节点、List节点、Container节点等的子节点。Rpc节点Rpc可以对其模型顶层的操作进行定义包含操作名称、输入参数和输出参数。在MD-CLI配置过程中通过查看指定路径下支持的YANG树结构可以清晰看到数据的层级结构辅助MD-CLI的配置操作。例如查看ifm/interfaces/interface路径下的YANG树。在YANG树结构的左侧为在YANG文件中定义的节点的名称右侧为Leaf/Leaf-list节点的数据类型说明如果某个节点有默认值则在数据类型后增加 表示如statistic-mode的默认值为interface-based。[ADMINHUAWEI] MDCLI tree ifm/interfaces/interfacemodule:huawei-ifm --rw ifm --rw interfaces --rw interface* [name] --rw namehuawei-pub-type:if-name --rw class? class-type --rw type? port-type --rw parent-name? - /huawei-ifm:ifm/interfaces/interface/name --rw number? string --rw description? string --rw admin-status? port-status --rw link-protocol? link-protocol --rw router-type? router-type --rw clear-ip-df? boolean false --rw link-up-down-trap-enable? boolean true --rw statistic-enable? boolean --rw statistic-mode? statistic-mode interface-based --rw(bandwidth-type)? | --:(bandwidth-mbps)| | --rw bandwidth? uint32 | --:(bandwidth-kbps)| --rw ban uint32 --rw mtu? uint32 ---- More ----MD-CLI与YANG模型各节点对应关系我们将从YANG的Container节点、Leaf节点、Leaf-list节点、List节点和Rpc节点分别展示和MD-CLI的对应关系。YANG模型中的Container节点映射为MD-CLI的节点视图Container节点名称对应为MD-CLI的节点视图名称。Container节点是若干相关节点的集合因而Container节点只有子节点而没有值。以huawei-arp.yang为例在YANG树结构中arp和speed-limits两个节点均为Container节点。module:huawei-arp --rw arp --rw speed-limits在MD-CLI中arp和speed-limits节点将会映射为节点视图。[ADMINHUAWEI] MDCLI arp [ADMINHUAWEI]/arp MDCLI speed-limits [ADMINHUAWEI]/arp/speed-limits MDCLI对于多级Container节点用户可以一次指定多级Container节点的名字直接进入目标Container节点对应的视图。[ADMINHUAWEI] MDCLI arp speed-limits [ADMINHUAWEI]/arp/speed-limits MDCLIYANG模型中的Leaf和Leaf-list节点映射为MD-CLI的操作对象节点名称为操作对象的名称。Leaf-list节点是Leaf节点的合集每个Leaf节点对特定数据类型有一个确定值。用户输入对象名称和参数值进行配置修改执行命令remove 对象名称 删除配置。以huawei-arp.yang为例在YANG树结构中strict-learn-enable、l2topo-detect-enable和rate-trap-interval都是Leaf节点。module:huawei-arp --rw arp --rw global --rw strict-learn-enable? boolean --rw l2topo-detect-enable? boolean --rw rate-trap-interval? uint32在MD-CLI中strict-learn-enable、l2topo-detect-enable和rate-trap-interval节点映射为MD-CLI的操作对象。执行命令remove 对象名称 可以删除配置。[*(ex)ADMINHUAWEI]/arp/global MDCLI strict-learn-enable false [*(ex)ADMINHUAWEI]/arp/global MDCLI remove rate-trap-interval进行配置操作时用户可以在一条MD-CLI命令行中输入多个操作对象和值。[*(ex)ADMINHUAWEI]/arp/global MDCLI strict-learn-enable false l2topo-detect-enable trueYANG模型中的List节点也映射为MD-CLI的节点视图。List节点定义了列表条目序列每个条目就像一个结构体或者一个记录实例由其关键叶节点的值key值唯一识别。与Container节点不同的是进入List视图除了指定List的节点名称外还需要指定所有List节点的相关Key值。以huawei-arp.yang为例在YANG树结构中speed-limit节点为List节点其Key由三个节点组成分别为slot-id、suppress-type和ip-type。module:huawei-arp --rw arp --rw speed-limits --rw speed-limit* [slot-id suppress-type ip-type] #speed-limit节点的三个key节点 --rw slot-id string --rw suppress-type suppress-type --rw ip-type suppress-ip-type --rw suppress-value uint32在MD-CLI中speed-limit节点映射为MD-CLI的节点视图进入节点视图时需要同时指定slot-id、suppress-type和ip-type的值。[ADMINHUAWEI]/arp/speed-limits MDCLI speed-limit slot-id 1 suppress-type arp ip-type src-ip [ADMINHUAWEI]/arp/speed-limits/speed-limit[slot-id1][suppress-typearp][ip-typesrc-ip] MDCLI在Container嵌套List的情况下用户也可直接同时指定Container和List直接进入List视图。[ADMINHUAWEI] MDCLI arp speed-limit slot-id 1 suppress-type arp ip-type src-ip [ADMINHUAWEI]/arp/speed-limits/speed-limit[slot-id1][suppress-typearp][ip-typesrc-ip] MDCLIYANG模型中的RPC节点为维护类节点用户通过RPC节点进行一些维护操作。和Container节点、List节点类似RPC节点名称映射为MD-CLI的节点视图名称。以huawei-file-operation.yang为例在YANG树结构中copy-file为RPC节点。module:huawei-file-operation ---x copy-file ---- input ---w src-file-name leafref ---w des-file-name string在MD-CLI中copy-file节点映射为MD-CLI的节点视图。用户可以输入RPC节点的名称进入RPC视图然后进行维护操作例如文件复制。[ADMINHUAWEI] MDCLI copy-file [(x)ADMINHUAWEI]/copy-file MDCLI src-file-name file-1.txt des-file-name file-2.txt [(x)ADMINHUAWEI]/copy-file MDCLI emithuawei-arp.yang与MD-CLI对应示例由上可知YANG树的层次结构在MD-CLI中通过视图的层次结构进行表达通过下图可直观的看到YANG节点和MD-CLI的命令之间的映射关系。在右侧的MD-CLI命令列表中缩进表示MD-CLI视图嵌套关系粗体表示MD-CLI视图名称和操作对象命令斜体表示相关命令参数包含具体的参数类型。YANG树结构 MD-CLI命令列表module:huawei-arp --rw arp ---------------------------------------------------------- arp --rw global ----------------------------------------------------- global | --rw strict-learn-enable? boolean ----------------------- strict-learn-enable boolean | --rw l2topo-detect-enable? boolean ----------------------- l2topo-detect-enable boolean | --rw rate-trap-interval? uint32 ------------------------ rate-trap-interval uint32 | --rw passive-learn-enable? boolean ----------------------- passive-learn-enable boolean | --rw topo-detect-disable? boolean ----------------------- topo-detect-disable boolean | --rw con-send-enable? boolean ----------------------- con-send-enable boolean | --rw con-send-maxnum? uint16 ------------------------ con-send-maxnum uint16 | --rw gratuitous-drop? boolean ----------------------- gratuitous-drop boolean | --rw vlanif-expiretime? uint32 ------------------------ vlanif-expiretime uint32 | --rw host-conflict-period? uint16 ------------------------ host-conflict-period uint16 | --rw host-conflict-threshold? uint16 ------------------------ host-conflict-threshold uint16 | --rw broadcast-max-num? uint16 ------------------------ broadcast-max-num uint16 --rw speed-limits ----------------------------------------------- speed-limits | --rw speed-limit* [slot-id suppress-type ip-type] ------------ speed-limit slot-id string suppress-type type ip-type ip-type | --rw slot-id string | --rw suppress-type suppress-type | --rw ip-type suppress-ip-type | --rw suppress-value uint32 ----------------------------- suppress-value uint32 --rw static-arps ------------------------------------------------ static-arps --rw static-arp* [ip-addr ni-name] --------------------------- static-arp ip-addr ipv4-address ni-name string --rw ip-addr ipv4-address-no-zone --rw ni-name leafref --rw mac-addr mac-address ----------------------------- mac-addr mac-address --rw vlan-id? uint16 ----------------------------------- vlan-id uint16