本站点使用Cookies,继续浏览表示您同意我们使用Cookies。 Cookies和隐私政策>

首页 信息速查 产品智能选型 IP知识百科

什么是MD-CLI?

MD-CLI(Model-Driven Command Line Interface)是基于YANG模型生成的既有机机交互又有人机交互能力的命令行工具。相比传统CLI,具有配置逻辑简单、机器解析处理容易和学习成本低等优点。

CLI和MD-CLI是什么?

CLI:命令行接口,一种以命令行形式与设备进行交互的工具。

CLI(Command 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模型的多种设备交互方式示意图
基于YANG模型的多种设备交互方式示意图

MD-CLI和传统CLI相比有什么优势?

优点一:简化配置逻辑

传统CLI在执行每条命令时,都会检查该命令操作对象的依赖关系,因此在配置时,需要严格遵守各条命令之间的依赖顺序。

传统CLI检查依赖关系示意图
传统CLI检查依赖关系示意图

MD-CLI的依赖校验是在提交阶段才执行,配置过程不需要配置逻辑校验,用户只需保证在提交时,相关的配置依赖关系已经满足即可,在编辑过程中,无需严格遵守业务之间的依赖逻辑。

MD-CLI检查生效示意图
MD-CLI检查生效示意图

优点二:降低学习成本

在网络管理场景下,用户需要学习传统CLI,以便对设备按需进行单点配置。同时,随着网络规模的增大,用户也需要学习YANG模型,以实现自动化管理。因此,新手用户需要同时学习传统CLI和YANG。另外,在传统CLI的学习中,用户还需进一步阅读相关的手册去确认不同厂商以及不同设备的功能和命令行形式是否有不同,学习过程长,成本高。

传统CLI场景下需求解决过程
传统CLI场景下需求解决过程

若使用MD-CLI,这一过程便只需要聚焦在设备不同的YANG结构上。用户在了解设备YANG模型结构和MD-CLI的几个基本操作指令后,即可导出MD-CLI的操作命令行,直接对设备进行配置。如果有自动化管理的需求,也可以利用MD-CLI进行脚本的编写,实现多设备进行批量管理。整个学习过程省去传统CLI命令格式的学习以及对不同厂商命令行格式较大差异的识别,降低了学习成本。

MD-CLI场景下需求解决过程
MD-CLI场景下需求解决过程

优点三:利于机器解析处理

传统CLI主要是面向人机交互界面,强调人的可读性,其命令行形式没有统一语法约定,各厂商差异大。并且,传统CLI命令回显是纯文本的,以便人可以阅读和理解。如果想采用机器对回显结果进行解析,难度就很大了。因为回显结果是非结构化的,有的是表格,有的是字符串,应用程序没有统一的标准去解析。除非针对每一个命令的回显结果去做适配,这会大大加大运维管理成本,其复杂性也会影响应用程序的稳定性。以下以查看指定接口不同长度范围的报文收发统计信息来展示传统CLI的命令行输出。

<HUAWEI> system-view
[HUAWEI] display interface statistics 100ge 1/0/1 verbose
         PacketLength(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                   0

MD-CLI的输出采用JSON格式,遵循业务YANG的定义和相关标准,结构化的信息便于使用自动化工具统一解析。它的内容层使用YANG模型,很好的弥补了人机接口的不足。以下以查看当前视图下candidate数据库中的配置为例,演示MD-CLI的命令行输出。

[*(ex)ADMIN@HUAWEI]/ifm/interfaces/interface[name="MEth0/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。

[ADMIN@HUAWEI]
MDCLI> tree ifm/interfaces/interface
module: huawei-ifm
+--rw ifm
   +--rw interfaces
      +--rw interface* [name]
         +--rw name                                             huawei-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节点,将会映射为节点视图。

    [ADMIN@HUAWEI]
    MDCLI> arp
    
    [ADMIN@HUAWEI]/arp
    MDCLI> speed-limits
    
    [ADMIN@HUAWEI]/arp/speed-limits
    MDCLI> 

    对于多级Container节点,用户可以一次指定多级Container节点的名字,直接进入目标Container节点对应的视图。

    [ADMIN@HUAWEI]
    MDCLI> arp speed-limits
    
    [ADMIN@HUAWEI]/arp/speed-limits
    MDCLI> 
  • YANG模型中的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)ADMIN@HUAWEI]/arp/global
    MDCLI> strict-learn-enable false
    
    [*(ex)ADMIN@HUAWEI]/arp/global
    MDCLI> remove rate-trap-interval

    进行配置操作时,用户可以在一条MD-CLI命令行中,输入多个操作对象和值。

    [*(ex)ADMIN@HUAWEI]/arp/global
    MDCLI> strict-learn-enable false l2topo-detect-enable true
  • YANG模型中的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的值。

    [ADMIN@HUAWEI]/arp/speed-limits
    MDCLI> speed-limit slot-id 1 suppress-type arp ip-type src-ip
    
    [ADMIN@HUAWEI]/arp/speed-limits/speed-limit[slot-id="1"][suppress-type="arp"][ip-type="src-ip"]
    MDCLI>

    在Container嵌套List的情况下,用户也可直接同时指定Container和List,直接进入List视图。

    [ADMIN@HUAWEI]
    MDCLI> arp speed-limit slot-id 1 suppress-type arp ip-type src-ip
    
    [ADMIN@HUAWEI]/arp/speed-limits/speed-limit[slot-id="1"][suppress-type="arp"][ip-type="src-ip"]
    MDCLI>
  • YANG模型中的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视图,然后进行维护操作,例如文件复制。

    [ADMIN@HUAWEI]
    MDCLI> copy-file
    
    [(x)ADMIN@HUAWEI]/copy-file
    MDCLI> src-file-name file-1.txt des-file-name file-2.txt
    
    [(x)ADMIN@HUAWEI]/copy-file
    MDCLI> emit

huawei-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
词条统计
  • 作者: 刘飞杨
  • 最近更新: 2024-02-26
  • 浏览次数: 2987
  • 平均得分:
分享链接到: