“我之前写了一篇以即插即用方式使用Velocity模板的博客文章。我答应提供更高级的例子,本文是一个开始。Velocity是一种模板编程语言,已用于Cisco Prime Infrastructure和APIC-EM。本系列重点介绍Day-N模板。如果您错过了之前的文章,第一篇文章中的信息可当做是对变量的简单回顾。”
变量|Variables
任何模板的核心都是“变量”的概念。变量允许针对特定设备自定义部分配置,同时确保其他部分在所有设备上的标准化。单个配置模板可以应用于很多设备。Velocity中的变量以“$”开头。如果需要在字符串中嵌入变量,可以使用${var}来标识该变量。
若想配置网络设备的主机名,可以使用cli命令“hostname adam-router”。“adam-router”是设备的名称。将此模板应用于一组设备时,唯一变化的是变量(${hname})。通过设置变量hname=“adam”,模板将被渲染为“adam router”。
绑定变量
可以使用绑定来访问有关设备的信息(从DNAC角度来看)。有关设备的属性,比如型号,可以链接到变量上。例如,在下面的模板中,我想将${device}设置为清单中的设备产品ID (PID)。
在模板编辑器中定义模板时,单击变量部分。
选择模板的变量
然后点击变量(device)和Bind to Source(右下角)。选择Source = “Inventory”, Entity = “Device”, 以及Attribute = “platformId”。这表示该变量应来自Inventory,特别是Device的相关数据。Attibute是可选的,但在这种情况下只有“platformId”(型号)是必须的。对于堆栈,其值是一个逗号分隔列表。
绑定变量
当应用于3650交换机时,这将呈现为hostname adam-WS-C3650-48PQ-E
条件语句|Conditionals
大多数编程语言都提供 if-else 结构。在Velocity中,这很简单,#if #end语句表示一个简单的条件。if语句有很多用例。
可选变量
有时变量可能是可选的,只有在设置了变量时才应该呈现配置行。在下面的示例中,如果$data_vlan变量为空,则将跳过vlan配置。
相关变量
基于一个变量,你可能想设置其他变量。这将减少模板中所有的变量数。#set用于分配变量。
在下面的示例中,如果$hostname的值为“switch01”,则变量$loopback被设置为“10.10.100.1”。
启用/禁用触发器
另一个例子是触发要启用或禁用的功能。例如,可以使用变量来切换启用/禁用NetFlow。
为简化示例,假设模板中也包含NetFlow收集器的定义。接口名称也可以是一个变量。在本示例中,“apply”设置为“true”以在接口上启用NetFlow,其他任何设置都将禁用NetFlow。
正则表达式|Regular Expressions
上面的if语句展示了字符串的完全匹配。如何进行模式匹配?幸运的是,Velocity模板支持正则表达式(regexp)。有关regexp的详细讨论超出了本文的范围,因为还有很多其他地方可以找到有关regexp的教程。
例如,单个模板可以针对9300交换机执行特定操作,但仍可应用于非9300交换机。交换机的型号(来自清单)可通过绑定变量获得。如上节所述。9300系列交换机的型号结构为9300-NNXXX或9300L-NNXXX-YY。例如,C9300-24UB, C9300-48UXM, C9300L-24P-4G。
相应的正则表达式为“C9300L?-[2|4][4|8].*”。第一部分只是字符串匹配“C9300”。“L?”表示“L”是可选的,有时存在有时不存在。“-”只是一个匹配。“[2|4]”表示2或4,与“[4|8]”相同。最后,“.*”匹配任何剩余字母。变量是$model, 如果正则表达式匹配,则$model.matches()将返回true。
使用正则表达式的另一种方式是替换字符串的一部分。在本例中,我想从型号中提取交换机上的端口数。
我用的是“replaceAll”而不是“match”。ReplaceAll接受正则表达式,以及指定用什么替换它的参数。在本例中,“$1”将替换正则表达式的内容。该正则表达式与上述表达式相同,唯一区别是“([2|4][4|8])”。()将模式保存在内部,稍后可以将其引用为“$1”。该模式是端口数。它将匹配24或48。$ports将设置为24或48。
如果$model=“C9300L-24P-4G”,则$port将设置为24。
接下来是什么?
本博客展示了Velocity模板的高级主题。本系列的下一个博客将对这些进行扩展,以更详细地介绍绑定变量,并提供更多示例。