Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

Jinja 语法和配置模板示例

CSO 配置模板由三个组件组成:

  • Jinja 模板配置,其中包含配置模板的逻辑和配置。(Jinja是Python的模板引擎,你可以在Web上找到几个Jinja资源。

  • 一个 Yang 数据模型文件,其中包含配置架构的描述符。

  • ViewDef(视图定义)文件,它是一个 JavaScript 对象表示法 (JSON) 文件,用于指定配置模板的 GUI 方面。

使用“添加配置模板”工作流添加模板时,可以使用 Jinja 模板语言指定模板配置和逻辑。然后,CSO 会根据您指定的模板配置和逻辑自动生成 Yang 数据模型和 ViewDef 文件。Yang 和 ViewDef 文件的生成对用户是透明的,不需要任何用户干预。

Jinja 语法和 CSO 关键词

下表分别列出了配置模板中常用的 Jinja 语法和配置模板中使用的关键字。

表 1:配置模板中使用的常见 Jinja 语法

语法

解释

{{ }}

表示将打印到模板输出的变量或表达式。例如:

{{tenant_name}}
注意:

CSO 模板引擎无法识别连字符,因此请在变量或表达式中使用下划线 (_)。

{# #}

表示不会包含在模板输出中的注释。例如:

{# This is an example of comment in Jinja syntax #}

{% %}

表示用于创建条件逻辑的语句:

  • {%- -%} 语句从输出中删除空格字符。

  • if当条件为 true 时,用于执行一组命令(括在和endif关键字之间if)的语句。

    {% if <condition> %}
    ...
    ...
    ...
    {% endif %}
  • - 语句用于在条件为 true 时执行一组命令(括在 and if else 关键字之间),在条件为 false 时执行另一组命令(括在 and endif 关键字之间else)。else if

    {% if <condition> %}
    ...
    ...
    {% else %}
    ...
    ...
    {% endif %}
  • for语句用于在条件为 true 时遍历一组命令(括在 和 endfor for 关键字之间)。

    {% for <condition> %}
    ...
    ..
    ...
    {% endfor %}

点 (.)

点 [运算符] 用于引用变量的属性。以下示例显示了一个 for 循环,您可以在其中添加多个前缀:

{% for prefix in Trusted_Network_Prefix_List %}
set groups trusted‐prefix policy‐options prefix‐list re‐ssh {{prefix.Trusted_Network_Prefix_List}}
{% endfor %}
注意:

如果为配置模板启用高级模式,则可以使用配置模板关键字。

表 2:配置模板关键字

关键 字

解释

post_config

向 CSO 指示后面的变量是数据类型。

pre_config

向 CSO 指示与设备关联的当前配置。pre_config 关键字用于比较变量字段的值,然后修改或删除目标设备的现有配置。

diff_config

向 CSO 指示应比较pre_config和post_config,CSO 应创建新的呈现配置,然后将其推送到目标设备。

示例 1:将单个 Junos OS 命令转换为 Jinja 语法

如果要将单个 Junos OS 命令转换为 Jinja 语法以在配置模板中使用:

  1. 标识在 Junos OS 命令中配置的变量。

    例如,在命令 set snmp trap-group CSO-Trp-Grp targets 192.0.2.100中,配置的变量为 CSO-Trp-Grp 和 192.0.2.100。

  2. 将 Junos OS CLI 命令转换为 Jinja 语法,方法是将每个变量括在双大括号中,如下所示: {{ Variable_Name }}

    所以,在这个例子中,如果我们使用 Trap_Group_Name and SNMP_Host_IP_Address 作为变量名,命令的 Jinja 语法如下:

  3. 如果将其粘贴到“添加配置模板”工作流的“模板配置”部分中,CSO 将按如下方式检测参数:

    参数

  4. 如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),则使用第一步中指示的值,CSO 将按如下方式呈现配置:

    请注意,尽管您为单个 Junos OS 命令提供了 JInja 语法,但 CSO 在配置中添加了其他命令。这是因为,默认情况下,CSO 使用 Junos OS 组来生成配置。Junos OS 组可以更轻松地应用和删除配置。有关更多信息,请参阅 了解 Junos OS 配置组

    如果不想使用 Junos OS 组,则在以 Jinja 语法指定配置时,必须在配置模板中打开高级模式。

示例 2:将 Junos OS 配置片段转换为 Jinja 语法

在此示例中,我们将以下 Junos OS 配置片段转换为 Jinja 语法,以便在配置模板中使用:

要将 Junos OS 配置转换为 Jinja 语法,请执行以下操作:

  1. 识别在 Junos OS 命令中配置的变量。为了便于理解,在下面的示例中,变量被括在尖括号 (<>) 内。

    注意:

    在此示例中,我们不将 DHCP-SERVER 视为变量。

  2. 通过标识变量、为每个变量提供名称并将每个变量括在双大括号中,将每个 Junos OS CLI 命令转换为 Jinja 语法。因此,在这种情况下,Jinja 语法如下:

  3. 将其粘贴到“添加配置模板”工作流的“模板配置”部分时,CSO 会检测参数,如下所示:

    参数

  4. 如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),则使用此示例的值,CSO 将按如下方式呈现配置:

示例 3:使用条件逻辑

此示例是上一示例的修改版本,我们将了解如何在配置模板中使用条件逻辑(iffor 语句)。

以上示例的说明如下:

  1. 在此示例中,我们添加一个 if 语句并将配置包含在该语句中,如下所示:

    这意味着仅当enable_Forwarding_Options为 True 时,才会应用配置。如果enable_Forwarding_Options为 False,则不应用任何配置。

    提示:

    如果要在enable_Forwarding_Options为 False 时应用其他配置,可以使用该 else 语句。

  2. 然后,我们添加一个for语句,以便为 、 Relay_InterfaceRelay_Zone变量配置Relay_Group_Name多组值。

    使用 for 语句时,CSO 呈现的 GUI(使用预览功能时)会在表(网格)中显示变量。然后,可以使用添加图标 (+) 向表中添加行,并根据需要配置一组或多组值。

  3. 将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:

    参数

  4. 如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并提供参数值(包括 、 Relay_InterfaceRelay_Zone的两组值Relay_Group_Name),CSO 将按如下方式呈现配置:

示例 4:使用变量替换

在此示例中,我们使用变量作为配置命令的一部分,以便在命令中使用我们为变量指定的

以上示例的说明如下:

  1. VLAN_Id我们使用参数的属性pool来设置 Junos OS 配置参数vlansvlan-id.

  2. 将 Jinja 命令 set groups MIST vlans V-{{pool.VLAN_Id}} vlan-id {{pool.VLAN_Id}} 粘贴到“添加配置模板”工作流的“模板配置”部分时,CSO 会检测如下参数:

    参数

    这是因为我们使用点 (.) 运算符来引用 VLAN_Id 参数 pool的属性。

  3. 如果使用预览功能呈现配置(对于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并为 提供 VLAN_Id值 120,CSO 将按如下所示呈现配置:

    在呈现的配置命令中,您可以看到参数vlans和分别设置为V-120vlan-id120,基于我们为VLAN_Id参数提供的值。

示例 5:使用筛选器、串联和设置变量

在此示例中,我们将了解如何使用串联和过滤器设置变量,然后在 Junos OS 配置命令中使用该变量。

以上示例的说明如下:

  1. Jinja 语句 {% set pool_name = Dhcp_Server_Name + ’_’ + Interface | replace(“/”,”_”) %} 用于设置一个名为 pool_name的变量,使用另外两个变量 Dhcp_Server_NameInterface,如下所示:

    1. | (pipe) 运算符用于将变量与筛选器分开,筛选器是修改变量的函数。在此示例中,我们使用过滤器通过将 replace(“/”,”_”) /(正斜杠)字符替换为 _(下划线)字符来修改Interface变量。

    2. 然后,我们使用运算符将 + 结果字符串与变量 Dhcp_Server_Name连接起来。

      注意:

      运算符 + 通常用于对数字相加,但当值为字符串时,字符串将串联起来。

    3. 最后,使用标记 set (与运算符一起 = )将调用 pool_name 的变量设置为串联变量。

  2. 然后,Junos OS 命令set system services dhcp-local-server overrides process-inform pool {{pool_name}}用于通过我们在上一步中设置的变量pool_name配置 Junos OS 配置语句pool

  3. 将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:

    参数

    如您所见,不会显示 Junos OS 命令或变量, pool_name 因为我们正在使用 InterfaceDhcp_Server_Name 变量来得出最终的 Junos OS 配置。

  4. 如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并提供 的值 Dhcp_Server_Name LA_dhcp_srvr 和 的 ge-0/1/2 Interface,CSO 将按如下所示呈现配置:

    如上一步所述,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:测试值

在此示例中,我们将了解如何测试值并根据测试条件的结果执行操作。

以上示例的说明如下:

  1. 我们在两个条件下测试参数 NewNetwork.VLAN_Id

    1. 是否定义了参数(通过使用 NewNetwork.VLAN_Id is defined 条件)

    2. 参数的长度是否大于 2(通过使用条件 (NewNetwork.VLAN_Id | count) > 2

    因为我们使用关键字 and

    • 两个条件都成立时,配置命令set vlan-id {{NewNetwork.VLAN_Id}}将添加到配置(CSO 生成)中。

    • 当任一条件为 false 时,配置将添加到配置 set vlans VL-{{NewNetwork.VLAN_Id}} 中。

  2. 将 Jinja 命令粘贴到添加配置模板工作流的模板配置部分时,CSO 会检测如下参数:

    参数

  3. 如果使用预览功能呈现配置(适用于名为瞻博网络的 OpCo 和名为 Test 的配置模板),并且:

    • 为 提供 VLAN_Id值 125,CSO 按如下方式呈现配置,因为这两个条件都为真:

    • 为 提供 VLAN_Id值 65 ,CSO 按如下方式呈现配置,因为其中一个条件为 false(参数长度不大于 2):