动态配置文件中的用户定义变量
用户定义的变量
在动态服务配置文件中,您可以通过 Junos OS 在 [edit dynamic-profiles profile-name variables]
层次结构级别配置自定义变量,并在层次结构中使用 [edit dynamic-profiles]
这些变量。在订阅者身份验证过程中,动态配置文件从外部服务器(例如 RADIUS)获取并替换这些变量的数据。在运行时,变量将替换为实际值,并用于配置用户接口。
您可以使用以下任一语句来配置用户定义变量:
default-value
- 为动态配置文件中的用户定义变量配置缺省值。当订阅者进行身份验证时,将应用系统用于这些变量的值。如果外部服务器不可访问或不包含变量值,则指定缺省值可为关联语句提供独立配置,或为语句配置提供备份。equals
- 为用户定义的变量配置一个表达式,该变量在运行时计算并作为变量值返回。mandatory
—指定外部服务器(例如,RADIUS)必须返回用户定义变量的值。如果外部服务器未返回变量的值,则动态配置文件将失败。uid
- 在为服务创建的动态配置文件中为参数化过滤器和 CoS 配置唯一 ID。uid-reference
- 在为服务创建的动态配置文件中配置一个变量,该变量引用参数化过滤器或 CoS 的唯一 ID。
定义如何获取变量的顺序很重要。若要确保从外部服务器获取任何必需变量,而不是从默认值或通过变量表达式派生值,必须首先定义任何必需变量。
在动态配置文件中配置用户定义的动态变量
本主题讨论如何在动态服务配置文件中配置用户定义的动态变量。您可以在层次结构级别定义一个变量,该变量 [edit dynamic-profiles profile-name variables]
在动态服务配置文件中的其他位置使用。您可以选择为动态配置文件正文中显示的任何动态变量指定默认值。当路由器无法访问外部服务器(例如 RADIUS)或以其他方式获取用作动态变量的值时,将使用默认变量值。或者,可以指定必须使用 RADIUS 返回的值;如果未收到该值,则配置文件将失败。
在配置任何动态变量默认值之前:
创建基本动态配置文件。
请参阅 配置基本动态配置文件。
确保路由器配置为启用客户端与 RADIUS 服务器之间的通信。
请参阅 指定订阅者访问的身份验证和计费方法。
配置您希望配置文件在验证订阅者时使用的所有 RADIUS 值。
要在动态服务配置文件中配置变量,请执行以下作:
在用户定义变量中使用变量表达式
通过 Junos OS,您可以创建表达式(算术运算符、字符串运算符和作数组),以用作动态配置文件中的变量。您可以在 [dynamic-profiles profile-name variables]
层次结构级别配置变量表达式。在运行时,将计算变量表达式并将其用作配置动态用户接口的变量值。
在动态配置文件中配置表达式时,必须遵循以下规则:
-
您只能在动态配置文件的可变节中配置表达式。
-
包含用户定义变量表达式的动态配置文件只能用于服务激活。
-
通常仅将表达式分配给用户定义的变量。不能将表达式分配给内部变量或预定义变量。
-
表达式值优先于默认值。
-
整个表达式必须包含在引号 (“ ”) 内。
-
表达式中的字符串必须在单引号 (' ') 内引号,并且单引号只能包含字符串。
-
空格被视为所有作数和运算符的分隔符。包含您在表达式中创建的空格的字符串被视为单个字符串,并包含任何前导或尾随空格。例如,要创建服务配置文件:
dynamic-profiles { service profile { variables { scheduler-name; video-filter equals “ ‘ Filter 1 ’ ” # Everything within the single quotation marks is considered a string, including the leading and trailing white space } } }
-
表达式必须是所有算术运算符或所有字符串运算符;除非正确转换为正确的类型,否则不允许混合算术运算符和字符串运算符。
-
表达式可以引用其他系统预定义变量或其他用户定义变量。但是,不允许在变量之间循环引用。例如,以下引用不正确:
dynamic-profiles { Service_Profile_1 { variables { scheduler-name; transmit-rate2 equals “ ( $transmit-rate1 * 2)/3” # refers to transmit-rate1 transmit-rate1 equals “ ( $transmit-rate2 * 2)/3” # refers to transmit-rate2 } } }
-
要为 BNG-CUPS 用户平面创建动态接口和接口集,请使用以下格式:
dynamic-profile { <dprof_name> { interfaces { interface-set <dynamic interface-set Name> { interface <interface-name> { unit "$junos-interface-unit"; } } … class-of-service { … interfaces { interface-set <dynamic interface-set Name> { output-traffic-control-profile <TCP Name>; } } } }
您可以为 BNG-CUPS 用户平面配置服务过滤器优先级,以控制数据包的服务评估顺序。您可以将优先级配置添加到动态配置文件。
dynamic-profiles { <dprof_name> { ... interfaces { pp0 { unit "$junos-interface-unit" { ... family inet { filter { input "$in-filter" precedence 20; output "$out-filter" precedence 20; } unnumbered-address "$junos-loopback-interface"; } family inet6 { filter { input "$inv6-filter" precedence 20; output "$outv6-filter" precedence 20; } unnumbered-address "$junos-loopback-interface"; } } } } … }
-
任何不包含“默认”值或“等于”表达式的必需变量都必须包含值作为服务激活的一部分。例如,在动态服务配置文件定义“service-video”中包含两个或更少必需变量的 RADIUS 服务 VSA(如“service-video( value1, value2)”成功。如果至少有一个必需变量没有任何与之关联的值(无论是通过“default”还是“equals”属性计算),服务激活都将失败。
表 1 列出了可用于创建表达式的受支持运算符和函数。优先级 5 是最高级别。
操作 |
算子 |
关联性 |
优先 |
行动 |
---|---|---|---|---|
算术加法 |
+ |
左 |
1 |
将运算符右侧和左侧的元素相加。 |
算术减法 |
- |
左 |
1 |
从运算符左侧的元素中减去运算符右侧的元素。 |
算术乘法 |
* |
左 |
2 |
将运算符左侧的元素乘以运算符右侧的元素。 |
算术除法 |
/ |
左 |
2 |
将运算符左侧的元素除以运算符右侧的元素。 |
算术模数 |
% |
左 |
2 |
将运算符左侧的元素除以运算符右侧的元素,并返回整数余数。如果运算符左侧的元素小于运算符右侧的元素,则结果为运算符左侧的元素。 |
串联 |
## |
左 |
3 |
通过将运算符左侧的字符串值和运算符右侧的值连接在一起来创建新字符串。 |
最大 |
最大值(param1,param2) |
左 |
4 |
取作为参数传递的两个值的最大值。 |
最低 |
最小值(param1,param2) |
左 |
4 |
取作为参数传递的两个值中的最小值。 |
圆 |
round(参数1) |
- |
4 |
将值舍入到最接近的整数。 |
截断 |
截断 (param1) |
- |
4 |
将非整数值截短到小数点左边的值。 |
转换为字符串 |
toStr(param1) |
- |
4 |
将括号内的变量转换为以 null 结尾的字符串。 |
转换为整数 |
toInt(param1) |
- |
4 |
将参数转换为整数。允许将单个字符串或变量作为参数。 |
随机 |
兰德() |
- |
4 |
生成一个随机数值。 |
如果不是零 |
ifNotZero(参数1, 参数2) |
左 |
4 |
如果第一个参数不为零,则返回第二个参数。如果第一个参数为零,则返回 NULL。 |
括弧 |
( ) |
- |
5 |
对作数和运算符进行分组,以获得与简单优先级不同的结果;实际上具有最高优先级。 |
在用值填充变量后计算表达式。评估在配置文件实例化之前立即进行,包括值检查。如果计算出的值不可接受,或者控制表达式语法的规则被破坏,则表达式评估将失败,配置文件不会实例化,并且会记录消息以描述错误。
表 2 列出了可能的表达式错误情况以及路由器软件采取的作。
错误 |
发生率 |
行动 |
变量值 |
---|---|---|---|
解析错误 |
提交检查阶段 |
提交失败 |
不適用 |
循环变量依赖性误差 |
提交检查阶段 |
提交失败 |
不適用 |
未定义表达式中的变量 |
提交检查阶段 |
提交失败 |
不適用 |
除以零 |
配置文件实例化 |
配置文件实例化失败 |
零 (0) |
向数字添加字符串 |
配置文件实例化 |
配置文件实例化失败 |
零 (0) |
溢出错误 |
配置文件实例化 |
配置文件实例化失败 |
定义 |
底溢错误 |
配置文件实例化 |
配置文件实例化失败 |
定义 |
您还可以使用默认值配置用户定义的变量。缺省值为关联语句提供独立配置,或者在 RADIUS 服务器不可访问或 VSA 属性不包含值时为语句配置提供备份。
用户定义变量中变量表达式的更改历史记录
是否支持某项功能取决于您使用的平台和版本。使用 功能浏览器 查看您使用的平台是否支持某项功能。
版本 | 说明 |
---|---|
19.3 | 从 Junos OS 19.3R1 版开始,您可以在动态配置文件的语句中 您还可以配置有限数量的表达式,以便为预定义变量建立默认值。请参阅 动态客户端配置文件的预定义变量默认值。 |
25.2 Junos OS 演化版 | 从 Junos OS 演化版 25.2R1 开始,您可以在 BNG-CUPS 用户平面模式下为动态配置文件配置接口集和家族(inet、inet6)输入或输出过滤器优先级。 |
另见
在动态配置文件中配置变量表达式
您可以创建表达式(算术运算符、字符串运算符和作数组),以用作动态配置文件中的变量。这些表达式用作配置动态用户接口的变量值。
要配置动态配置文件变量表达式,请执行以下作:
表 4 提供了可以使用支持的运算符和函数创建的几个表达式示例。
例 |
描述 |
---|---|
video-filter 等于 “' filter1' ” |
将字符串“Filter1”分配给动态 $video-filter 变量。 |
video-filter2 等于 “$video-filter ## ' Filter2' ” |
将动态变量“$video-filter”转换为字符串,并将新字符串与字符串“Filter2”连接起来。结果是分配给 $video-filter2 变量的字符串“$video-filter Filter2”。 |
tempvar 等于“120” |
将“120”转换为整数,并将整数分配给$tempvar变量。 |
transmit-rate2 等于 “ ( $transmit-rate1 * 2)/3 + $tempvar)” |
将“transmit-rate1”变量乘以 2,然后将该值除以 3 和 “$tempvar” 值之和。结果分配给 $transmit-rate2 变量。 |
主机 IP 等于 “ '203.0.113.2' ” |
将字符串“203.0.113.2”分配给 $host-ip 变量。 |
最大价值 “max($max 1,$max 2)” |
将值“max1”或“max2”中的较大值分配给 $max-val 变量。 |
最小值 “$min($var 1,30)” |
将值“var1”和“30”中较小的值分配给 $min-val 变量。 |
rounded-var 等于 “round($var 1 )” |
将变量 “$var 1” 的值舍入到最接近的整数,并将该值赋值给 $rounded-var 变量。 |
trunc-var 等于 “trunc(1234.5)” |
将括号中的值截短到小数点的左侧,并将结果值赋给 $trunc-var 变量。 |
bwg-shaping-rate 等于 “$ancp-下行 - ($ancp-下行 % 2 * (1 - $sp-QoS-Cell-mode))” |
根据括号中设置的优先级计算表达式。 |
temp-filter1 等于 “ 'Filter1' ## toStr($filter)” |
将“$filter”变量转换为字符串值,并将转换后的字符串与字符串“Filter1”连接起来。生成的组合字符串将分配给 $temp-filter1 变量。 |
动态配置文件概述的条件配置
您可以为动态配置文件配置条件配置语句,以动态获取客户端或服务的订阅者信息。
条件配置包括两个主要步骤:
定义条件变量
在配置语句中引用条件变量
条件变量定义为表达式 ifNotZero (param1, param2)。在此表达式中,是一个用户定义的变量, param1 其值派生自外部服务器(如 RADIUS param2 ),可以是用户定义的变量、函数、作、数字或字符串。条件变量可以是用户定义的变量,也可以是唯一 ID (UID) reference 变量。它不能是预定义变量或 UID 变量。在 Junos OS 中,只有服务动态配置文件支持条件变量。
引用条件变量的配置语句称为 conditional 配置语句。定义条件变量后,这些变量将在配置语句中 dynamic-profiles 引用,并在实例化服务配置文件时进行处理。以下服务配置文件配置语句支持条件变量:
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter input filter-name
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter output filter-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then policer policer-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then hierarchical-policer policer-name
dynamic-profiles profile-name class-of-service scheduler-maps map-name forwarding-class class-name scheduler scheduler-name
在服务配置文件实例化期间,系统在评估条件变量和条件配置语句时遵循以下规则集:
在函数
ifNotZero
(param1, param2) 中,如果未从外部服务器接收 a param1 的值,并且未配置默认值,则该变量的值将被视为非零并 param2 进行计算。如果函数 (, ) 中的值param1为 0,则返回 NULL 作为表达式的值,并且param2不计算。 param2param1
ifNotZero
在这种情况下,条件变量的值将变为 NULL,并且引用条件变量的配置语句将被忽略。如果的 param1 值不为零,则 param2 计算 THEN 并将其值作为表达式的值返回。
以下filter-servicecos-service配置示例显示了如何应用这些规则:
过滤器服务配置示例
filter-service { variables { input-filter-var mandatory; output-filter-var mandatory; bw-limit-var mandatory; term1-var default-value term1; input-filter-ref { equals "ifNotZero($input-filter-var,$input-filter-var)"; uid-reference; } output-filter-ref { equals "ifNotZero($output-filter-var,$output-filter-var)"; uid-reference; } policer1-ref { equals "ifNotZero($bw-limit-var,'policer1')"; uid-reference; } term1 equals "ifNotZero($term1-var,$term1-var)"; input-filter uid; output-filter uid; policer1 uid; } interfaces { pp0 { unit "$junos-interface-unit" { family inet { filter { input "$input-filter-ref" precedence 50; output "$output-filter-ref" precedence 50; } } } } } firewall { family inet { filter "$input-filter" { interface-specific; term $term1 { then { policer "$policer1-ref"; service-accounting; } } term rest { then accept; } } filter "$output-filter" { interface-specific; term rest { then accept; } } } policer "$policer1" { if-exceeding { bandwidth-limit "$bw-limit-var"; burst-size-limit 15k; } then discard; } } }
filter-service 在配置示例中,input-filter-ref
、output-filter-ref
、policer1-ref
、和term1
是条件变量,而input "$input-filter-ref" precedence 50
、output "$output-filter-ref" precedence 50
、term $term1
、和policer "$policer1-ref"
是条件配置语句。在此示例中,如果值为 input-filter-var
0,则条件变量input-filter-ref
的值变为 NULL。因此,引用条件变量的整个配置语句 input “$input-filter-ref” precedence 50
,都将被忽略。但是,如果该变量的值不为零,则在服务配置文件实例化期间处理配置语句。
CoS 服务配置示例
cos-service { variables { sch1_var mandatory; sch2_var mandatory; sch1_ref { equals "ifNotZero($sch1_var,$sch1_var)"; uid-reference; } sch2_ref { equals "ifNotZero($sch2_var,$sch2_var)"; uid-reference; } smap1 uid; sch1 uid; sch2 uid; } class-of-service { scheduler-maps { "$smap1" { forwarding-class best-effort scheduler "$sch1_ref"; forwarding-class assured-forwarding scheduler "$sch2_ref"; } } schedulers { "$sch1" { transmit-rate percent 30; buffer-size percent 30; priority low; } "$sch2" { transmit-rate percent 10; buffer-size percent 10; priority high; } } } }
cos-service 在配置示例中,sch1_ref
和 sch2_ref
是条件变量,而forwarding-class best-effort scheduler "$sch1_ref"
和 forwarding-class assured-forwarding scheduler "$sch2_ref"
是条件配置语句。与配置示例中的filter-service评估类似,如果条件变量中引用的任何变量的值为 0,则在 CoS 服务配置文件实例化期间,将忽略且不处理引用条件变量的配置语句。