Jinja 语法和配置模板示例
CSO 配置模板由三个组件组成:
Jinja 模板配置,其中包含配置模板的逻辑和配置。(Jinja是Python的模板引擎,你可以在Web上找到几个Jinja资源。
一个 Yang 数据模型文件,其中包含配置架构的描述符。
ViewDef(视图定义)文件,它是一个 JavaScript 对象表示法 (JSON) 文件,用于指定配置模板的 GUI 方面。
使用“添加配置模板”工作流添加模板时,可以使用 Jinja 模板语言指定模板配置和逻辑。然后,CSO 会根据您指定的模板配置和逻辑自动生成 Yang 数据模型和 ViewDef 文件。Yang 和 ViewDef 文件的生成对用户是透明的,不需要任何用户干预。
Jinja 语法和 CSO 关键词
下表分别列出了配置模板中常用的 Jinja 语法和配置模板中使用的关键字。
语法 |
解释 |
---|---|
|
表示将打印到模板输出的变量或表达式。例如: {{tenant_name}}
注意:
CSO 模板引擎无法识别连字符,因此请在变量或表达式中使用下划线 (_)。 |
|
表示不会包含在模板输出中的注释。例如: {# This is an example of comment in Jinja syntax #} |
|
表示用于创建条件逻辑的语句:
|
点 (.) |
点 [运算符] 用于引用变量的属性。以下示例显示了一个 {% for prefix in Trusted_Network_Prefix_List %} set groups trusted‐prefix policy‐options prefix‐list re‐ssh {{prefix.Trusted_Network_Prefix_List}} {% endfor %} |
如果为配置模板启用高级模式,则可以使用配置模板关键字。
关键 字 |
解释 |
---|---|
post_config |
向 CSO 指示后面的变量是数据类型。 |
pre_config |
向 CSO 指示与设备关联的当前配置。pre_config 关键字用于比较变量字段的值,然后修改或删除目标设备的现有配置。 |
diff_config |
向 CSO 指示应比较pre_config和post_config,CSO 应创建新的呈现配置,然后将其推送到目标设备。 |
示例 1:将单个 Junos OS 命令转换为 Jinja 语法
如果要将单个 Junos OS 命令转换为 Jinja 语法以在配置模板中使用:
标识在 Junos OS 命令中配置的变量。
例如,在命令
set snmp trap-group CSO-Trp-Grp targets 192.0.2.100
中,配置的变量为 CSO-Trp-Grp 和 192.0.2.100。将 Junos OS CLI 命令转换为 Jinja 语法,方法是将每个变量括在双大括号中,如下所示:
{{ Variable_Name }}
。所以,在这个例子中,如果我们使用 Trap_Group_Name and SNMP_Host_IP_Address 作为变量名,命令的 Jinja 语法如下:
set snmp trap-group {{ Trap_Group_Name }} targets {{ SNMP_Host_IP_Address }}
如果将其粘贴到“添加配置模板”工作流的“模板配置”部分中,CSO 将按如下方式检测参数:
参数
SNMP_Host_IP_Addresses Trap_Group_Name
如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),则使用第一步中指示的值,CSO 将按如下方式呈现配置:
delete groups default-domain_Juniper_Test delete apply-groups default-domain_Juniper_Test edit groups default-domain_Juniper_Test set snmp trap-group CSO-Trp-Grp targets 192.0.2.100 exit set apply-groups default-domain_Juniper_Test
请注意,尽管您为单个 Junos OS 命令提供了 JInja 语法,但 CSO 在配置中添加了其他命令。这是因为,默认情况下,CSO 使用 Junos OS 组来生成配置。Junos OS 组可以更轻松地应用和删除配置。有关更多信息,请参阅 了解 Junos OS 配置组。
如果不想使用 Junos OS 组,则在以 Jinja 语法指定配置时,必须在配置模板中打开高级模式。
示例 2:将 Junos OS 配置片段转换为 Jinja 语法
在此示例中,我们将以下 Junos OS 配置片段转换为 Jinja 语法,以便在配置模板中使用:
set forwarding-options dhcp-relay server-group DHCP-SERVER 192.0.2.50 set forwarding-options dhcp-relay active-server-group DHCP-SERVER set forwarding-options dhcp-relay group CSO-Relay-Grp1 interface ge-0/0/2.0 set security zones security-zone trust host-inbound-traffic system-services dhcp
要将 Junos OS 配置转换为 Jinja 语法,请执行以下操作:
识别在 Junos OS 命令中配置的变量。为了便于理解,在下面的示例中,变量被括在尖括号 (<>) 内。
注意:在此示例中,我们不将 DHCP-SERVER 视为变量。
set forwarding-options dhcp-relay server-group DHCP-SERVER <Relay_IP> set forwarding-options dhcp-relay active-server-group DHCP-SERVER set forwarding-options dhcp-relay group <Relay_Group_Name> interface <Relay_Interface> set security zones security-zone <Relay_Zone> host-inbound-traffic system-services dhcp
通过标识变量、为每个变量提供名称并将每个变量括在双大括号中,将每个 Junos OS CLI 命令转换为 Jinja 语法。因此,在这种情况下,Jinja 语法如下:
set forwarding-options dhcp-relay server-group DHCP-SERVER {{Relay_IP}} set forwarding-options dhcp-relay active-server-group DHCP-SERVER set forwarding-options dhcp-relay group {{Relay_Group_Name}} interface {{Relay_Interface}} set security zones security-zone {{Relay_Zone}} host-inbound-traffic system-services dhcp
将其粘贴到“添加配置模板”工作流的“模板配置”部分时,CSO 会检测参数,如下所示:
参数
Relay_IP Relay_Interface Relay_Zone Relay_Group_Name
如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),则使用此示例的值,CSO 将按如下方式呈现配置:
delete groups default-domain_Juniper_Test delete apply-groups default-domain_Juniper_Test edit groups default-domain_Juniper_Test set forwarding-options dhcp-relay server-group DHCP-SERVER 192.0.2.50 set forwarding-options dhcp-relay active-server-group DHCP-SERVER set forwarding-options dhcp-relay group CSO-Relay-Grp1 interface ge-0/0/2.0 set security zones security-zone trust host-inbound-traffic system-services dhcp exit set apply-groups default-domain_Juniper_Test
示例 3:使用条件逻辑
此示例是上一示例的修改版本,我们将了解如何在配置模板中使用条件逻辑(if
和 for
语句)。
{%- if enable_Forwarding_Options %} set forwarding-options dhcp-relay server-group DHCP-SERVER {{RelayIP }} set forwarding-options dhcp-relay active-server-group DHCP-SERVER {% for relay in RelayOptions %} set forwarding-options dhcp-relay group {{ relay.Relay_Group_Name }} interface {{ relay.Relay_Interface }} set security zones security-zone {{ relay.Relay_Zone }} host-inbound-traffic system-services dhcp {% endfor %} {% endif %}
以上示例的说明如下:
在此示例中,我们添加一个
if
语句并将配置包含在该语句中,如下所示:{%- if enable_Forwarding_Options %} ... ... {% endif %}
这意味着仅当enable_Forwarding_Options为 True 时,才会应用配置。如果enable_Forwarding_Options为 False,则不应用任何配置。
提示:如果要在enable_Forwarding_Options为 False 时应用其他配置,可以使用该
else
语句。然后,我们添加一个
for
语句,以便为 、Relay_Interface
和Relay_Zone
变量配置Relay_Group_Name
多组值。{% for relay in RelayOptions %} set forwarding-options dhcp-relay group {{ relay.Relay_Group_Name }} interface {{ relay.Relay_Interface }} set security zones security-zone {{ relay.Relay_Zone }} host-inbound-traffic system-services dhcp {% endfor %}
使用
for
语句时,CSO 呈现的 GUI(使用预览功能时)会在表(网格)中显示变量。然后,可以使用添加图标 (+) 向表中添加行,并根据需要配置一组或多组值。将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:
参数
RelayIP enable_Forwarding_Options RelayOptions Relay_Interface Relay_Zone Relay_Group_Name
如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并提供参数值(包括 、
Relay_Interface
和Relay_Zone
的两组值Relay_Group_Name
),CSO 将按如下方式呈现配置:delete groups default-domain_BLR_SOLN_test delete apply-groups default-domain_BLR_SOLN_test edit groups default-domain_BLR_SOLN_test set forwarding-options dhcp-relay server-group DHCP-SERVER 192.0.2.50 set forwarding-options dhcp-relay active-server-group DHCP-SERVER set forwarding-options dhcp-relay group CSO-RelayGrp1 interface ge-0/0/2.0 set security zones security-zone trust host-inbound-traffic system-services dhcp set forwarding-options dhcp-relay group RelayGrp2 interface ge-1/0/2.0 set security zones security-zone untrust host-inbound-traffic system-services dhcp exit set apply-groups default-domain_BLR_SOLN_test
示例 4:使用变量替换
在此示例中,我们使用变量作为配置命令的一部分,以便在命令中使用我们为变量指定的 值 。
set groups MIST vlans V-{{pool.VLAN_Id}} vlan-id {{pool.VLAN_Id}}
以上示例的说明如下:
VLAN_Id
我们使用参数的属性pool
来设置 Junos OS 配置参数vlans
和vlan-id
.将 Jinja 命令
set groups MIST vlans V-{{pool.VLAN_Id}} vlan-id {{pool.VLAN_Id}}
粘贴到“添加配置模板”工作流的“模板配置”部分时,CSO 会检测如下参数:参数
pool VLAN_Id
这是因为我们使用点 (.) 运算符来引用
VLAN_Id
参数pool
的属性。如果使用预览功能呈现配置(对于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并为 提供
VLAN_Id
值 120,CSO 将按如下所示呈现配置:delete groups default-domain_Juniper_Test delete apply-groups default-domain_Juniper_Test edit groups default-domain_Juniper_Test set groups MIST vlans V-120 vlan-id 120 exit set apply-groups default-domain_Juniper_Test
在呈现的配置命令中,您可以看到参数
vlans
和分别设置为V-120
和vlan-id
120
,基于我们为VLAN_Id参数提供的值。
示例 5:使用筛选器、串联和设置变量
在此示例中,我们将了解如何使用串联和过滤器设置变量,然后在 Junos OS 配置命令中使用该变量。
{% set pool_name = Dhcp_Server_Name + '_' + Interface | replace("/", "_") %} set system services dhcp-local-server overrides process-inform pool {{pool_name}}
以上示例的说明如下:
Jinja 语句
{% set pool_name = Dhcp_Server_Name + ’_’ + Interface | replace(“/”,”_”) %}
用于设置一个名为 pool_name的变量,使用另外两个变量 Dhcp_Server_Name 和 Interface,如下所示:|
(pipe) 运算符用于将变量与筛选器分开,筛选器是修改变量的函数。在此示例中,我们使用过滤器通过将replace(“/”,”_”)
/(正斜杠)字符替换为 _(下划线)字符来修改Interface变量。然后,我们使用运算符将
+
结果字符串与变量 Dhcp_Server_Name连接起来。注意:运算符
+
通常用于对数字相加,但当值为字符串时,字符串将串联起来。最后,使用标记
set
(与运算符一起=
)将调用 pool_name 的变量设置为串联变量。
然后,Junos OS 命令
set system services dhcp-local-server overrides process-inform pool {{pool_name}}
用于通过我们在上一步中设置的变量pool_name
配置 Junos OS 配置语句pool
。将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:
参数
Interface Dhcp_Server_Name
如您所见,不会显示 Junos OS 命令或变量, pool_name 因为我们正在使用 Interface 和 Dhcp_Server_Name 变量来得出最终的 Junos OS 配置。
如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并提供 的值
Dhcp_Server_Name
LA_dhcp_srvr 和 的 ge-0/1/2Interface
,CSO 将按如下所示呈现配置:delete groups default-domain_Juniper_Test delete apply-groups default-domain_Juniper_Test edit groups default-domain_Juniper_Test set system services dhcp-local-server overrides process-inform pool LA_dhcp_srvr_ge-0_1_2 exit set apply-groups default-domain_Juniper_Test
如上一步所述,ge-0/1/2 中的 / 字符首先替换为 _ 字符,这会将字符串更改为 ge-0_1_2。此字符串与 LA_dhcp_srvr 连接以生成字符串 LA_dhcp_srvr_ge-0_1_2,该字符串在 Junos OS 配置命令中使用。
因此,生成的 Junos OS 配置命令为
set system services dhcp-local-server overrides process-inform pool LA_dhcp_srvr_ge-0_1_2
。
示例 6:测试值
在此示例中,我们将了解如何测试值并根据测试条件的结果执行操作。
{%- if NewNetwork.VLAN_Id is defined and (NewNetwork.VLAN_Id | count) > 2 -%} set vlan-id {{NewNetwork.VLAN_Id}} {% else %} set vlans VL-{{NewNetwork.VLAN_Id}} {% endif %}
以上示例的说明如下:
我们在两个条件下测试参数
NewNetwork.VLAN_Id
:是否定义了参数(通过使用
NewNetwork.VLAN_Id is defined
条件)参数的长度是否大于 2(通过使用条件
(NewNetwork.VLAN_Id | count) > 2
)
因为我们使用关键字
and
:当两个条件都成立时,配置命令
set vlan-id {{NewNetwork.VLAN_Id}}
将添加到配置(CSO 生成)中。当任一条件为 false 时,配置将添加到配置
set vlans VL-{{NewNetwork.VLAN_Id}}
中。
将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:
参数
NewNetwork VLAN_Id
如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并且:
为 提供
VLAN_Id
值 125,CSO 按如下方式呈现配置,因为这两个条件都为真:delete groups default-domain_Juniper_Test delete apply-groups default-domain_Juniper_Test edit groups default-domain_Juniper_Testset vlan-id 125 exit set apply-groups default-domain_Juniper_Test
为 提供
VLAN_Id
值 65 ,CSO 按如下方式呈现配置,因为其中一个条件为 false(参数长度不大于 2):delete groups default-domain_BLR_SOLN_testtmp delete apply-groups default-domain_BLR_SOLN_testtmp edit groups default-domain_BLR_SOLN_testtmp set vlans VL-65 exit set apply-groups default-domain_BLR_SOLN_testtmp