2.3 YANG:数据建模语言
到目前为止,YANG已经被多次提及,但它到底是什么?YANG是一种API的合约语言。这意味着你可以使用YANG编写一个规范,针对某个特定主题定义客户端和服务器之间的接口,如图2-1所示。YANG编写的规范称为“YANG模块”(YANG module),一组YANG模块通常统称为“YANG模型”(YANG model)。YANG模型通常侧重于客户端使用标准化动作来操作和观察数据,其中包含一些操作和通知。请注意,在NETCONF和RESTCONF术语中,控制器是客户端,网元是服务器,因为控制器启动配置会话。有趣的是,YANG不是一个首字母缩略词,至少它从未在任何文档中被扩展或引用为首字母缩略词。这个词背后有一个特殊的含义,这是个玩笑。实际上它源自Yet Another Next Generation(数据建模语言)。
图2-1 基本模型
假设你正在设计下一个炫酷的服务器应用。该应用可能有也可能没有普通用户的某种接口,但肯定会有一个管理接口,应用所有者可以使用该接口来管理和监控应用。显然,这个管理界面需要有一个清晰而简洁的API。
基于YANG的服务器发布了一套YANG模块,这些模块一起形成了系统的YANG模型。YANG模块声明客户可以做什么。接下来列出的四个方面对于所有应用都相同,但具体数据和操作将有所不同。为了清楚起见,假设该应用程序是一个路由器。其他应用程序可能具有截然不同的数据和操作类型,这取决于YANG模型所包含的内容。
- 配置:例如,决定日志文件的存储位置;说明网络接口使用的速度;并声明某个特定路由协议是禁用还是启用,如果是,则声明它将具有哪些对端。
- 监测状态:例如,读取每个网络接口上有多少丢失的数据包;检查风扇速度;并罗列网络中实际活跃的对端。
- 接收通知:例如,获悉虚拟机已经准备就绪;温度超过配置阈值的警告;或收到重复登录失败的警告。
- 调用操作:例如,重置丢包计数器;从系统运行traceroute到某个地址;或执行系统重启。
作为下一个炫酷应用的作者,你需要决定YANG模块中的应用。在YANG环境中,应用是一个抽象的服务,例如:第三层虚拟专用网络(L3VPN)或访问控制服务。这些应用通常使用网络设备,例如路由器、负载均衡器和基站控制器。应用也可以是其他领域的设备,例如配电网控制器、仓库机器人控制系统和办公楼控制系统。你的YANG模块中还有什么其他功能?与应用运维工程师协作,你能够选择应用将使用的身份验证机制以及身份验证服务器的位置。你可能还希望为运维工程师提供一个运行状态的字段,来提示你的应用当前正在为多少用户提供服务。也许应用支持通知功能以某种方式上报滥用应用的用户?如何操作生成数据库内容的调试转储用来进行故障排除?最后,在管理界面中应用可能有更多的功能。
设备的YANG模型通常被称为“模式”(schema),如在数据库模式或蓝图中一样。模式基本上是应用和设备之间交换消息的结构和内容。这与实例数据(系统中的实际配置和监测数据)非常不同。实例数据描述当前配置和当前监控值。模式描述潜在的配置、潜在的监测数据、潜在的通知以及管理员决定执行的潜在操作。
YANG语言还包含其他模型语言中不存在的可扩展性和灵活性。新模块可以增强其他模块中定义的数据层次结构,在现有数据组织中的适当位置无缝添加数据。YANG还允许定义新的语句,允许以一致的方式扩展语言本身。请注意,YANG模型(请记住API合约)不会更改,除非服务器有软件升级,或者安装了新功能许可证。一旦管理员决定更改配置或者系统状态因内部或外部事件而更改,实例数据就会更改。
小的YANG模型可能只声明十几个不同的元素,甚至只有一个元素(例如,一个只定义重新启动操作的模型)。然而,有些YANG模型非常大,有成千上万的元素。汽车或工厂中每个元素对应一个按钮、控制盘、指示器、仪表或灯。现代汽车的仪表盘及其周围可能有上百种元素。一个核电站可能有一千多个元素。然而核心路由器要复杂得多,拥有超过100 000个控制接口元素。
由于模式定义了具有许多实例(例如,接口或访问控制规则)的元素,因此实例数据可能比模式大得多,具有数百万个实例。
YANG语言本身由互联网工程任务组(IETF)[13]定义。最新版本是YANG1.1,在RFC 7950中被定义,YANG1.0是在RFC 6020中定义的旧版本。本文编写时YANG1.0和YANG1.1都在广泛使用。新的YANG1.1(RFC 7950)不会使YANG1.0(RFC 6020)过时。YANG1.1是YANG语言的维护版本,解决了原始规范中的歧义和缺陷。作为参考,YANG的概念在第三章中进行解释。YANG1.1的额外功能记录在RFC 7950第1.1节中。现在,YANG1.1应该是YANG模块的默认版本。