57

基于场景建模的自动化配置

 5 years ago
source link: https://www.sdnlab.com/22393.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者简介:晏志文,数通测试专家,熟悉传统网络技术及行业解决方案,密切关注新兴网络,ICT融合技术。

网络设备业务模块繁多,不仅模块内存在大量层级依赖的配置命令,同时模块内或模块间的的引用和叠加可以组合出不计其数的业务模型。企业网业务的多样性也决定了很难找到一种通用性的组合或模板来覆盖全部的业务场景。

scene-module-auto-668x400.png

一种方式是按照传统网管思路,业务不做抽象,仅完成CLI到GUI的一对一映射,好处就是实现简单,无需关注业务模型,但向用户暴露了大量的无需关注的业务参数,包括相关模块内参数或非相关模块参数,用户仍需理解厂商设备的配置逻辑,无法做到向导式的自动化配置。另一种实现是基于企业的业务模型的一致性,针对具体的业务模型做客户化定制,好处是以面向用户的更加友好的方式抽象了业务模型,屏蔽了厂商的配置逻辑,但同时也限制了实现的扩展性和复用性。

软件开发领域的大量实践活动都体现了抽象能力,稍微有点追求就要多思考如何把事情变得优雅拒绝体力劳动。面向对象的继承和多态分离了共性和差异;IOC通过松耦合的实现解决了代码入侵,将依赖延迟到了运行时;面向切面的思想实现了不改动原始代码情况下的功能注入;MVC使前后端人员可以并行开发;ORM中的对象模型采用代码生成工具自动完成...

曾经做过设备的命令分析,模块内除了树形层级,模块间除了和业务相关的一对多、多对多关系没有任何可以抽象的共性东西,简单粗暴的按模块封装带来的是类型的泛滥,随之而来的是大量的重复劳动,难以复用,难于维护。本文提出一种基于场景建模的自动化配置方法,将模型从代码逻辑中抽离出来,通过模型实现扩展,逻辑获得稳定,模型驱动页面生成配置向导,最终完成数据、模型、逻辑映射成最终的设备配置。

以BGP模块为例,模块的命令构造出一棵命令树,节点间的父子关系表现的是命令的层级关系。所有的模块的命令树生成了一个命令森林,共同构成了设备的命令集。

scene-module-auto-1.png

图一 BGP模块命令树

上图表达的是模块视角,而一个具体的业务可能是由一个或多个模块构成,模块内用到的命令往往不是全集,所以在业务视角下的模块其实是一棵经过剪枝的命令树的子集,例如L3vpn业务视角下BGP模块应该是下图的样子。一个业务是由多个模块的命令树子集构成。

scene-module-auto-2.png

图二 BGP模块命令剪枝

设备的最终配置表达的是一个业务场景,业务场景可以分解为不同的业务,业务间通过一种链式关系最终完成对场景功能的实现,所以业务场景、业务、模块间就有了下图的关系。

scene-module-auto-3.png

图三 场景-业务-模块模型

场景是面向用户的表现层,是真正的业务视角,是更加友好的人机接口,屏蔽了配置逻辑和设备特性。场景建模是一种自下而上的关系表达,自动化配置下发则是该过程的反向映射。代码逻辑只需要完成场景模型语义的解析、命令参数的关联映射以及场景到用户界面配置向导的自动生成,最终完成将变化的场景从逻辑中分离出来使代码逻辑稳定通用。

系统功能的扩展转化成映射和模型元数据的构建,最关键的问题是参数的映射推导和模型的语义表达。前面提到过数据+模型就是最终设备配置,这里的数据就是业务的配置参数,参数并不是全部都要提炼到人机界面的向导中要求用户输入的,很多参数可以通过建立mapping关系完成自动的推导关联。还是以L3vpn业务为例,大致需要接口、VRF、BGP等模块,接口绑定VRF引用的是VRF实例,BGP的VRF地址族依然引用的是该实例,用户不需要也不应该进行三次的VRF输入,而是创建VRF实例后完成BGP和接口的参数自动关联。甚至VRF实例名称这种用户不关心的参数都应该由系统自动生成。如下图所示的mapping配置,映射关系包含Service内的模块间映射(map_in),和跨Service的模块间映射(map_between)。"l3vpn"业务内部建立参数映射关系,key值"vrf ->def_para->para1[0]"对应VRF的实例名称,无论到用户向导获取还是系统自动生成,均为需要确定的参数,value数组中对应的模块参数自动引用该参数,图中显示的"bgp->def_para->para6[0]"对应BGP的VRF地址族,"interface->def_para->para2[0] "对应接口绑定的VRF实例名。关于键值的定义,即如何映射到命令参数的参照下文的业务模型元数据。

scene-module-auto-4.png

图四 参数映射元数据

如下图所示"l3vpn"业务用到了VRF模块,BGP模块,Interface模块,模块名称后面的"*"表达可以建立多对多的关系。

scene-module-auto-5.png

图五 L3vpn业务定义元数据

模块展开后就是该模块在此业务中用到的命令树子集,分为"def"必选配置和"opt"可选配置,"def_para"和"opt_para"分别对应必选配置和可选配置中的配置命令的参数定义。

scene-module-auto-6.png

图六 模块元数据结构

再次展开就深入到了模块命令这一级,命令的key可以为自定义的命令索引,可以为SNMP协议的OID,也可以为Yang文件中的索引。总之"vrfname"这个key最终会索引到真实的配置命令"ip vrf *",*为需要确定的VRF实例名称,继续通过"para1"索引到参数定义。"description"为参数描述,当参数表现在用户界面时作为参数提示,"type"为参数类型,索引到一个类型定义表中,做正则检查参数的合法性。"value"表达参数的生成方式,是内部自动生成还是外部输入。

scene-module-auto-7.png

图七 模块命令元数据定义

scene-module-auto-8.png

图八 模型推导生成用户向导界面

模型参数到模型的映射最终生成设备配置,通过南向接口下发设备。进一步的对组网的端到端业务还可以进行设备间的参数推导关联,实现业务的端到端下发。控制器需要保存设备的配置状态,完成配置的冲突检测和事务性回滚。
本文简要介绍了一种基于场景建模的自动化配置思路,通过定义Schema表达业务场景和参数映射关系,自动完成用户页面推导和参数关联。对于不同行业的业务场景,可以不改变代码逻辑而进行快速的灵活定制。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK