表达式
表达式是 StyleBook 最强大的功能之一。您可以在各种场景中使用 StyleBook 表达式来计算动态值。以下示例是一个将参数值与文字字符串连接起来的表达式。
示例:
$parameters.appname + "-mon"
<!--NeedCopy-->
此表达式检索名为 appname 的参数,并将其与字符串 -mon 连接。
支持以下类型的表达式:
算术表达式
- 加法 (+)
- 减法 (-)
- 乘法 (*)
- 除法 (/)
- 取模 (%)
示例:
- 两个数字相加:$parameters.a + $parameters.b
- 两个数字相乘:$parameters.a * 10
- 查找一个数字除以另一个数字后的余数:
15%10 结果为 5
字符串表达式
- 连接两个字符串 (+)
示例:
连接两个字符串:str(“app-“) + $parameters.appname
列表表达式
合并两个列表 (+)
示例:
-
连接两个列表:$parameters.external-servers + $parameters.internal-servers
-
如果
$parameters.ports-1为 [80, 81] 且$parameters.port-2为 [81, 82],则$parameters.ports-1 + $parameters.ports-2显示为列表 [80, 81, 81, 82]。
关系表达式
-
== :测试两个操作数是否相等,如果相等则返回 true,否则返回 false。
-
!= :测试两个操作数是否不同,如果不同则返回 true,否则返回 false。
-
> :如果第一个操作数大于第二个操作数,则返回 true,否则返回 false。
-
>= :如果第一个操作数大于或等于第二个操作数,则返回 true,否则返回 false。
-
< :如果第一个操作数小于第二个操作数,则返回 true,否则返回 false。
-
<= :如果第一个操作数小于或等于第二个操作数,则返回 true,否则返回 false。
示例:
- 相等运算符的使用:
$parameters.name = = "abcd" - 不等运算符的使用:
$parameters.name != "default" - 其他关系运算符的示例
- 10 > 9
- 10 >= 10
- 0 < 9
- 10 <= 9
- 10 == 10
- 10 != 1
逻辑表达式 - 布尔
-
and:逻辑“与”运算符。如果两个操作数都为 true,则结果为 true,否则为 false。
-
or:逻辑“或”运算符。如果其中一个操作数为 true,则结果为 true,否则为 false。
-
not:一元运算符。如果操作数为 true,则结果为 false,反之亦然。
-
in:测试第一个参数是否是第二个参数的子字符串
-
in:测试项是否是列表的一部分
注意
您可以对表达式进行类型转换,其中字符串转换为数字,数字转换为字符串。同样,您可以将
tcp-port转换为数字,将 IP 地址转换为字符串。在任何运算符之前和之后使用分隔符。您可以使用以下分隔符:
运算符之前:
space、tab、comma、(、)、[、]运算符之后:
space、tab、(、[例如:
abc + def
100 % 10
10 > 9
逐字字符串表达式
当字符串中的特殊字符必须采用其文字形式时,您可以使用逐字字符串。这些字符串可以包含转义字符、反斜杠、引号、括号、空格、方括号等。在逐字字符串中,特殊字符的常规解释会被跳过。字符串中的所有字符都以其文字形式保留。
在 StyleBook 中,您可以使用逐字字符串以其文字形式包含 NetScaler 策略表达式。策略表达式通常包含特殊字符。如果没有逐字字符串,您必须通过将字符串分解为子字符串来转义特殊字符。
要创建逐字字符串,请按如下方式将字符串封装在特殊字符之间:
~{string}~
<!--NeedCopy-->
您可以在 StyleBook 中的任何位置使用逐字字符串。
注意
请勿在输入字符串中使用字符序列
}~,因为此序列表示逐字字符串的结束。
示例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~
<!--NeedCopy-->
目标表达式
在 StyleBook 定义中,您可以使用 $current-target 表达式来引用当前目标 NetScaler 实例。要专门引用目标 NetScaler 实例的 IP 地址,请按如下方式使用此表达式:
$current-target.ip
<!--NeedCopy-->
示例:
components:
-
name: lb-comp
type: ns::lbvserver
properties:
name: $current-target.ip + "-lbvserver"
<!--NeedCopy-->
在此示例中,lbvserver 的名称是使用目标 NetScaler 实例的 IP 地址构建的。
表达式类型验证
StyleBook 引擎允许在编译时进行更强的类型检查,即在导入 StyleBook 本身时验证编写 StyleBook 时使用的表达式,而不是在创建配置包时验证。
对参数、替换、组件、组件属性、组件输出、用户定义变量(repeat-item、repeat-index、替换函数的参数)等的所有引用都将验证其存在性和类型。
类型检查示例:
在以下示例中,lbvserver StyleBook 的端口属性的预期类型为 tcp-port。在 NetScaler Console 中,类型验证在编译时(导入时)进行。编译器发现字符串和 tcp-port 不是兼容类型,因此 StyleBook 编译器会显示错误并无法导入或迁移 StyleBook。
components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: mylb
ipv46: 10.102.190.15
port: str("80")
servicetype: HTTP
<!--NeedCopy-->
要成功编译此 StyleBook,请在编译器中将以下内容声明为数字:
port: 80
标记无效表达式的示例:
在早期版本中,当无效表达式分配给属性名称时,编译器不会检测到无效表达式,并允许将 StyleBook 导入 NetScaler Console。现在,如果将此 StyleBook 导入 NetScaler Console,编译器会识别此类无效表达式并进行标记。因此,StyleBook 无法导入 NetScaler Console。
在此示例中,分配给 lb-sg-binding-comp 组件中名称属性的表达式为:$components.lbvserver-comp.properties.lbvservername。但是,lbvserver-comp 组件中没有名为 lbvservername 的属性。在早期 NetScaler Console 版本中,编译器会允许此表达式并成功导入它。实际故障会在用户想要使用此 StyleBook 创建配置包时发生。但是现在,此类错误在导入期间被识别,并且 StyleBook 未导入 NetScaler Console。请手动更正此类错误并导入 StyleBook。
Components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: mylb
ipv46: 10.102.190.15
port: 80
servicetype: HTTP
-
name: sg-comp
type: ns::servicegroup
properties:
servicegroupname: mysg
servicetype: HTTP
-
name: lb-sg-binding-comp
type: ns::lbvserver_servicegroup_binding
condition: $parameters.create-binding
properties:
name: $components.lbvserver-comp.properties.lbvservername
servicegroupname: $components.sg-comp.properties.servicegroupname
<!--NeedCopy-->
列表索引
现在可以通过直接索引列表项来访问它们:
| 表达式 | 描述 |
$components.test-lbs[0] |
引用 test-lbs 组件中的第一个项 |
$components.test-lbs[0].properties.p1 |
引用 test-lbs 组件中第一个项的属性 p1 |
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname |
引用 servicegroups 组件中第二个项的属性 servicegroupname,该项是 lbcomps 组件中第一个项的输出 |