表达式
StyleBook 最强大的功能之一是使用表达式。您可以在各种场景中使用 StyleBook 表达式来计算动态值。以下示例是一个将参数值与文字字符串连接起来的表达式。
示例:
$parameters.appname + "-mon"
此表达式检索名为
appname 的参数,并将其与字符串 -mon 连接起来。
注意
在 StyleBook 定义中定义参数和表达式时,StyleBook 支持使用保留关键字。保留关键字为 -
and、false、in、not、true 和 or。
支持以下类型的表达式:
算术表达式
-
加法 (+)
-
减法 (-)
-
乘法 (*)
-
除法 (/)
-
模 (%)
示例:
-
两个数字相加:$parameters.a + $parameters.b
-
两个数字相乘:$parameters.a * 10
-
查找一个数字除以另一个数字后的余数:
15%10 结果为 5
字符串表达式
-
连接两个字符串 (+)
示例:
连接两个字符串:str("app-") + $parameters.appname
列表表达式
合并两个列表 (+)
示例:
关系表达式
-
== :测试两个操作数是否相等,如果相等则返回 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:逻辑“与”运算符。如果两个操作数都为真,则结果为真,否则为假。
-
or:逻辑“或”运算符。如果其中一个操作数为真,则结果为真,否则为假。
-
not:一元运算符。如果操作数为真,则结果为假,反之亦然。
-
in:测试第一个参数是否是第二个参数的子字符串
-
in:测试项是否是列表的一部分
注意
您可以对表达式进行类型转换,其中字符串转换为数字(使用 int() 内置函数),数字转换为字符串(使用 str() 内置函数)。同样,您可以将
tcp-port 转换为数字(使用 int() 内置函数),并且可以将 IP 地址转换为字符串(使用 str() 内置函数)。
在任何运算符前后使用分隔符。您可以使用以下分隔符:
-
运算符之前:
space、tab、comma、(、)、[、] -
运算符之后:
space、tab、(、[
例如:
-
abc + def -
100 % 10 -
10 > 9 -
$item in $parameters.some-list
Splat 表达式
Splat 表达式
[*] 提供了一种更简单的方法,可以从复杂列表中为所有迭代检索特定属性。您现在可以在 StyleBook 定义中包含 splat 表达式。
语法:
list[*].attribute
此表达式迭代其左侧指定的列表中的所有项,并返回其右侧指定的属性值。
当您想从列表中检索每个虚拟服务器的 IP 地址或主机名时,可以使用以下 splat 表达式:
示例 1:
$parameters.server-members[*].hostname
此表达式返回所有服务器成员的主机名列表。
示例 2:
$parameters.server-members[*].sub-domains[*].name
此表达式返回每个服务器成员子域下的所有名称列表。
这些表达式始终返回最右侧元素类型的列表。
原义字符串表达式
当字符串中的特殊字符必须采用其字面形式时,您可以使用原义字符串。这些字符串可以包含转义字符、反斜杠、引号、括号、空格、方括号等。在原义字符串中,特殊字符的常规解释会被跳过。字符串中的所有字符都以其字面形式保留。
在 StyleBook 中,您可以使用原义字符串以字面形式包含 NetScaler 策略表达式。策略表达式通常包含特殊字符。如果没有原义字符串,您必须通过将字符串分解为子字符串来转义特殊字符。
要创建原义字符串,请按如下方式将字符串封装在特殊字符之间:
~{string}~
您可以在 StyleBook 表达式中使用原义字符串。
注意
请勿在输入字符串中使用字符序列
}~,因为此序列表示逐字字符串的结尾。
示例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~
有关详细信息,请参阅在 StyleBook 中允许特殊字符及其文字形式。
目标表达式
在 StyleBook 定义中,您可以使用
$current-target 表达式来引用当前目标 NetScaler 实例。要专门引用目标 NetScaler 实例的 IP 地址,请按如下方式使用此表达式:
$current-target.ip
示例:
components:
-
name: lb-comp
type: ns::lbvserver
properties:
name: $current-target.ip + "-lbvserver"
在此示例中,
lbvserver 的名称使用目标 NetScaler 实例的 IP 地址。
表达式类型验证
StyleBook 引擎现在允许在编译时进行更强的类型检查,即,在编写 StyleBook 时使用的表达式在导入 StyleBook 本身时进行验证,而不是在创建配置包时进行验证。
对参数、替换、组件、组件属性、组件输出、用户定义变量(重复项、重复索引、替换函数的参数)等的所有引用都将验证其存在性和类型。
类型检查示例:
在以下示例中,
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
要成功编译此 StyleBook,请在编译器中将以下内容声明为数字:
port: 80
标记无效表达式的示例:
将 StyleBook 导入 NetScaler Console 时,编译器会识别并标记无效表达式。因此,StyleBook 无法导入到 NetScaler Console。
在以下示例中,分配给
lb-sg-binding-comp 组件中名称属性的表达式为:$components.lbvserver-comp.properties.lbvservername。但是,lbvserver-comp 组件中没有名为 lbvservername 的属性。
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
数据类型的隐式类型转换
当您对不同数据类型使用 StyleBook 表达式时,StyleBook 引擎现在会将输出隐式类型转换为适当的数据类型。数据类型的隐式类型转换支持二进制操作和值赋值。
二进制操作示例:
-
将类型为
string和number的两个变量相加 (+),会将输出数据类型设置为string。
$parameters.appname + '_' + $parameters.app_instance_num
-
将类型为
string和ipaddress的两个变量相加 (+),会将输出数据类型设置为string。
$parameters.appname + '_' + $parameters.instance_ip
-
将类型为
ipaddress和number的两个变量相加 (+),会将输出数据类型设置为ipaddress。
$parameters.instance_ip + $parameters.number
-
将类型为
ipaddress和number的两个变量相减 (-),会将输出数据类型设置为ipaddress。
$parameters.instance_ip - $parameters.number
-
将类型为
string和number的两个变量相乘 (*),会将输出数据类型设置为string。
$parameters.dummy_str * $parameters.count
值分配示例:
-
如果变量定义为
string数据类型,则分配的值将转换为定义的数据类型。
name: $parameters.port * 3
-
如果变量定义为
portnumber数据类型,则分配的值将转换为portnumber数据类型,但存在例外情况。
port: $index + $parameters.lower_limit
列表索引
现在可以通过直接索引来访问列表项:
| 表达式 | 描述 |
$components.test-lbs[0] |
指 thetest-lbs 组件中的第一个项 |
$components.test-lbs[0].properties.p1 |
指 test-lbs 组件中第一个项的属性 p1 |
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname |
指 servicegroups 组件中第二个项目的属性 servicegroupname,该属性是 lbcomps 组件中第一个项目的输出 |
StyleBook 中的策略表达式
StyleBooks GUI 允许您通过从列表中选择项目来构建 NetScaler® 策略表达式,从而帮助您更快、更准确地创建表达式。
StyleBook 中的策略表达式允许您创建灵活且可自定义的配置。您可以根据各种参数、属性或变量指定条件。策略表达式通常用于实施 NetScaler 策略配置。
在 StyleBooks GUI 中启用策略表达式编辑器
要使 EPA 或表达式编辑器可用于某个参数,请在参数定义中指定
is_policy_expression GUI 属性。启用此设置(设置为 true)后,您可以在为此参数输入值时调用表达式编辑器。
parameters:
-
name: expression
type: string
label: Expression
required: true
gui:
is_policy_expression: true
创建和构建策略表达式
-
导航到 Applications > Configurations > StyleBooks。StyleBooks 页面显示 NetScaler Console 中所有可用的 StyleBook。
-
选择一个在其参数中包含策略表达式的 StyleBook。
-
单击创建配置。在创建配置页面中,输入此 StyleBook 中定义的所有参数的值。
-
单击表达式字段旁边的图标。创建表达式页面随即出现。

-
在创建表达式中,使用直观的下拉列表构建您的策略表达式。单击提交。
如果要创建自定义策略表达式,请单击 EPA 编辑器或表达式编辑器来构建您的表达式。在预览表达式中查看您的表达式,然后单击提交。 -
选择应部署配置的目标 NetScaler 实例,然后单击“提交”。
