专注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组成元素简单介绍表
元素 | 描述 |
---|---|
module | YANG将数据模型构建为模块,模块名与YANG文件名一致。 一个模块可以从其他模块中导入数据,也可以从子模块中引用数据。 外部模块的引入(import & include):“include”声明允许模块或者子模块引用子模块中的材料,“import”声明允许引用其他模块中定义的材料。 |
namespace | 模块的名字空间,是全球唯一的URI。在对数据的XML编码过程中会使用到名字空间。 |
prefix | namespace的简写,简写唯一。 |
organization | YANG归属组织名。 |
contact | YANG模块的联系信息。 |
description | YANG模块的功能描述。 |
revision | YANG模块的版本信息,提供了模块的编辑版本历史。 |
container | 容器节点,用来描述若干相关节点的集合。 |
list | 列表节点,定义了列表条目序列,每个条目就像一个结构体或者一个记录实例,由其关键叶节点的值(key值)唯一识别。 |
leaf | 叶节点。一个叶节点包含简单的数据,如整形数据或字符串。 |
使用PYANG工具可以把YANG模型转换成YANG tree格式,用一棵树的形式能直观的看出层次化模型结构,感兴趣的同学可以阅读YANG工具的开源:PYANG安装方法的最后一小节“YANG tree可视化”。