YANG:简介——我理解的YANG

专注NETCONF/YANG技术科普,接受任何问题,包括我答不上来的问题。欢迎光临!欢迎提问:链接

引子

之前在【侃大山】为啥要有NETCONF?为啥要有YANG?的时候说过,IETF的NETMOD工作组在对历史网管协议一通批判后,花大力气基于XML设计了一套新的网络配置管理协议,也就是NETCONF(Network Configuration Protocol)协议。这时光有管理协议,但是并没有统一定义各个设备厂商的API接口描述语言。
在这里插入图片描述
NETCONF协议分为安全传输层、消息层、操作层、内容层,即上图的(1)(2)(3)(4)层。其中,
(3)操作层支持的基础操作有:查询配置或者状态;查询配置;配置下发;复制一份配置并下发;删除配置;配置加锁、解锁;关闭会话;强制关闭会话。——至此各种操作定义都很清晰明确。
(4)内容层则只有一个模糊的举例(上图红色框中)。——configuration data怎么定义?YANG标准的出现就是为了解决这个问题。

YANG是NETCONF协议的一种面向管理对象的数据建模语言

YANG是NETCONF协议的一种面向管理对象的数据建模语言。YANG模型定义了数据的层次化结构,可用于基于NETCONF的操作,包括配置、状态数据、远程过程调用和通知。从NETCONF的视角而言,YANG可以对NETCONF客户端和服务器端之间发送的所有数据进行一个完整的描述。从设备管理对象数据建模的视角而言,YANG是对本设备上业务对象的一种层次化数据建模。
我们来看一个具体的NETCONF报文1,找到报文的内容层。
在这里插入图片描述
观察内容层,这是一个ISIS协议模型。顶层isiscomm是YANG模块的名称,这个YANG模块的YANG文件名叫做huawei-isiscomm.yang2。虽然还不知道这个YANG模块的详细内容,但是我们根据XML的基础知识能大致知道ISIS特性下有ISIS的实例,每个实例下有ISIS实例ID、实例描述信息,以及实例所属的VPN。当然NETCONF报文只能体现模型的片段,实际的YANG模型文件内容一定比这个多。

学习一个具体的YANG文件

huawei-system.yang3是一个短小精练的YANG模型文件。个人比较喜欢。你可以从github上下载此YANG文件,下载方法见YANG模型的开源:各国际标准的YANG模型和各厂商开源的YANG模型。一起来学习:

/*
Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
*/
module huawei-system {
  namespace "urn:huawei:yang:huawei-system";
  prefix system;
  import huawei-pub-type {
    prefix pub-type;
  }
  import huawei-extension {
    prefix ext;
  }
  
  organization
    "Huawei Technologies Co., Ltd.";
  contact
    "....";
  description
    "System.";
  revision 2020-03-02 {
    description
      "Initial revision.";
    reference
      "Huawei private.";
  }
  ext:task-name "system";
  
  typedef risk-level-type {
    type enumeration {
      enum "high" {
        value 0;
        description
          "High level.";
      }
      ...
      enum "low" {
        value 2;
        description
          "Low level.";
      }
    }
    description
      "Security risk level.";
    }
  }
  ...
  // add grouping here
  container system {
    description
      "System.";
    container system-info {
      description
        "Configure system information.";
      leaf sys-name {
        type string {
          length "1..246";
        }
        default "HUAWEI";
        description
          "System name.";
      }
      leaf sys-contact {
        type string {
          length "1..255";
        }
        default "R&D Beijing, Huawei Technologies co.,Ltd.";
        description
          "System contact information.";
      }
      leaf sys-location {
        type string {
          length "1..255";
        }
        default "Beijing China";
        description
          "System location information.";
      }
      ...
      leaf sys-uptime {
        type pub-type:time-tick;
        config false;
        description
          "Time elapses since the system is running.";
      }
      ...
      }
    }
    container security-risks {
      config false;
      description
        "List of security risk information.";
      list security-risk {
        key "level feature-name type content";
        description
          "Statistics of security risk.";
        leaf level {
          type risk-level-type;
          description
            "Security risk Level.";
        }
        leaf feature-name {
          type string {
            length "1..31";
          }
          description
            "Feature name.";
        }
        leaf type {
          type security-risk-type;
          description
            "Security risk type.";
        }
        leaf content {
          type string {
            length "1..511";
          }
          description
            "Risk information.";
        }
        leaf repair-action {
          type string {
            length "1..511";
          }
          description
            "Repair action.";
        }
      }
    }
  }
  // add augment here
  // add rpc here
}

module是YANG模块的基本单元,YANG模型是由一个个module以及module之间的连接关系组成的。module是写YANG文件的基本框架,包括以下几种类型的语句:

  • module框架:这个module名称是huawei-system。
  • head语句:namespace、prefix是必须要有的;module中定义的所有节点都属于这个唯一的特定XML名字空间;prefix是用来定义和module、namespace相关联的标识符的前缀,用于netconf报文,或者其他YANG文件import自己。yang-version这里没写,是默认yang1.0。
  • 连接语句:import、include。module引用module用import;一个module下包含多个子模块用include。huawei-system.yang引用了huawei-pub-type和huawei-extension。几乎每个设备厂商都会有一两个公共基础YANG模块供各业务模块调用,思科、juniper也是这样。huawei-pub-type和huawei-extension是华为的两个公共基础YANG模块,huawei-pub-type定义了网络协议中的一些公共数据类型;huawei-extension定义了厂商的一些扩展语法。
  • 元信息:organization、contract;
  • 版本信息:revision语句根据日期区分相同YANG模块的不同版本。
  • 定义语句:container、list、leaf、leaf-list、grouping等等
    涉及内容较多,后面讲。

最后汇总一个YANG module组成元素简单介绍表

元素描述
moduleYANG将数据模型构建为模块,模块名与YANG文件名一致。 一个模块可以从其他模块中导入数据,也可以从子模块中引用数据。 外部模块的引入(import & include):“include”声明允许模块或者子模块引用子模块中的材料,“import”声明允许引用其他模块中定义的材料。
namespace模块的名字空间,是全球唯一的URI。在对数据的XML编码过程中会使用到名字空间。
prefixnamespace的简写,简写唯一。
organizationYANG归属组织名。
contactYANG模块的联系信息。
descriptionYANG模块的功能描述。
revisionYANG模块的版本信息,提供了模块的编辑版本历史。
container容器节点,用来描述若干相关节点的集合。
list列表节点,定义了列表条目序列,每个条目就像一个结构体或者一个记录实例,由其关键叶节点的值(key值)唯一识别。
leaf叶节点。一个叶节点包含简单的数据,如整形数据或字符串。

使用PYANG工具可以把YANG模型转换成YANG tree格式,用一棵树的形式能直观的看出层次化模型结构,感兴趣的同学可以阅读YANG工具的开源:PYANG安装方法的最后一小节“YANG tree可视化”。


  1. 报文来自:https://support.huawei.com/enterprise/zh/doc/EDOC1100138323/d602da5e ↩︎

  2. 公网已经搜不到huawei-isiscomm.yang这个文件了。据我所知,这个文件是华为多年前YANG重构之前的YANG文件,那个时候的命名格式还是小驼峰。 ↩︎

  3. https://github.com/Huawei/yang/blob/master/network-router/8.20.0/ne40e-x8x16/huawei-system.yang ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值