内置函数
StyleBook 中的表达式可以使用内置函数。
例如,您可以使用内置函数
str() 将数字转换为字符串。
str($parameters.order)
或者,您可以使用内置函数
int() 将字符串转换为整数。
int($parameters.priority)
以下是 StyleBook 表达式中支持的内置函数列表及其用法示例:
str() 函数
str() 函数将输入参数转换为字符串值。
允许的参数类型:
-
string -
number -
tcp-port -
boolean -
ipaddress
示例:
-
"set-" + str(10)函数返回"set-10"。 -
str(10)函数返回10。 -
str(1.1.1.1)函数返回1.1.1.1。 -
str(True)函数返回"True"。 -
str(NetScaler Console)函数返回"NetScaler Console"。
int() 函数
int() 函数将字符串、数字、IP 地址或 tcpport 作为参数,并返回一个整数。
示例:
-
int("10")函数返回10。 -
int(10)函数返回10。 -
int(ip('0.0.4.1'))函数返回1025。
bool() 函数
bool() 函数接受任何类型作为参数。如果参数值为 false、空或缺失,则此函数返回 false。
否则,它返回
true。
示例:
-
bool(true)函数返回true。 -
bool(false)函数返回false。 -
如果
$parameters.a为false、空或缺失,则bool($parameters.a)函数返回false。
长度()
len() 函数将字符串或列表作为参数,并返回字符串中的字符数或列表中的项目数。
示例 1:
如果您按如下方式定义替换项:
items: ["123", "abc", "xyz"]
len($substitutions.items) 函数返回 3
示例 2:
len("NetScaler Console") 函数返回 10。
示例 3:
如果
$parameters.vips 具有值 ['1.1.1.1', '1.1.1.2', '1.1.1.3'],则 len($parameters.vips) 函数返回 3。
最小值()
函数
min() 接受列表或一系列数字或 TCP 端口作为参数,并返回最小项。
带有数字/TCP 端口序列的示例:
-
函数
min(80, 100, 1000)返回80。 -
函数
min(-20, 100, 400)返回-20。 -
函数
min(-80, -20, -10)返回-80。 -
函数
min(0, 100, -400)返回-400。
带有数字/TCP 端口列表的示例:
-
支持
$parameters.ports是一个 TCP 端口列表,其值为:[80, 81, 8080]。函数min($parameters.ports)返回80。
最大值()
函数
max() 接受列表或一系列数字或 TCP 端口作为参数,并返回最大项。
带有数字/TCP 端口序列的示例:
-
函数
max(80, 100, 1000)返回1000。 -
函数
max(-20, 100, 400)返回400。 -
函数
max(-80, -20, -10)返回-10。 -
max(0, 100, -400)函数返回100。
数字/TCP 端口列表示例:
-
支持
$parameters.ports是 TCP 端口列表,其值为:[80, 81, 8080]。max($parameters.ports)函数返回8080。
二进制()
bin() 函数接受一个数字作为参数,并返回一个以二进制格式表示该数字的字符串。
表达式示例:
bin(100) 函数返回 0b1100100。
八进制()
oct() 函数接受一个数字作为参数,并返回一个以八进制格式表示该数字的字符串。
表达式示例:
oct(100) 函数返回 0144。
十六进制()
hex() 函数接受一个数字作为参数,并返回一个以十六进制格式表示该数字的小写字符串。
表达式示例:
函数
hex(100) 返回 0x64。
小写()
函数
lower() 接受一个字符串作为参数,并返回该字符串的小写形式。
示例:
函数
lower("NetScaler Console") 返回 NetScaler Console。
大写()
函数
upper() 接受一个字符串作为参数,并返回该字符串的大写形式。
示例:
函数
upper("NetScaler Console") 返回 NetScaler Console。
求和()
函数
sum() 接受一个数字列表或 tcpports 作为参数,并返回列表中数字的总和。
示例 1:
如果您按如下方式定义替换: substitutions:
list-of-numbers = [11, 22, 55]
函数
sum($substitutions.list-of-numbers) 返回 88。
示例 2:
如果
$parameters.ports 是 [80, 81, 82],则 sum($parameters.ports) 函数返回 243。
pow() 函数
pow() 函数接受两个数字作为参数,并返回一个数字,该数字表示第一个参数的第二个参数次幂。
示例:
pow(3,2) 函数返回 9。
ip()
ip() 函数接受整数、字符串或 IP 地址作为参数,并根据输入值返回 IP 地址。
示例:
-
在
ip函数中指定 IP 地址:ip(3.1.1.1)函数返回3.1.1.1。 -
在
ip函数中指定字符串:ip('2.1.1.1')函数返回2.1.1.1 -
在
ip函数中指定整数:-
ip(12)函数返回0.0.0.12。 -
当您在
ip函数中将整数指定为字符串时,它会返回输入的等效 IP 地址。ip('1025')函数返回0.0.4.1。
此函数还支持整数加法和减法运算,并返回一个结果 IP 地址。-
加法:
ip(1025) + ip(12)函数返回0.0.4.13。 -
减法:
ip('1025') - ip(12)函数返回0.0.3.245。 -
组合加法和减法:
ip('1.1.1.1') + ip('1.1.1.1') – ip(2)返回2.2.2.0。
-
ip_network()
ip_network 函数将 IP 地址和网络掩码长度作为参数,并返回 IP 网络表示法。
示例 1:
ip_network(1.1.1.1, 28) 函数返回 1.1.1.1/28。
示例 2:
考虑
$parameters.ipaddr 的值 1.1.1.1。ip_network($parameters.ipaddr, 30) 函数返回 1.1.1.1/30。
示例 3:
考虑
$parameters.netmask-len 的值 24。ip_network(23.1.12.76, $parameters.netmask-len) 函数返回 23.1.12.76/24。
network_ip()
network_ip() 函数返回指定 IP 网络中的第一个 IP 地址。
示例:
network_ip(1.1.1.1/28) 函数返回 1.1.1.0。在此示例中,1.1.1.0 是给定网络中的第一个 IP 地址。
子网()
subnets() 函数返回指定 IP 网络和子网掩码长度的子网列表。
示例:
subnets(1.1.1.1/28, 30) 函数返回给定 IP 网络和子网掩码长度的子网列表。输出可能如下所示:
[1.1.1.0/30', '1.1.1.4/30', '1.1.1.8/30', '1.1.1.12/30']
netmask_ip()
netmask_ip() 函数返回指定 IP 网络的子网掩码 IP 地址。
示例:
netmask_ip(1.1.1.1/28) 函数返回 255.255.255.240。对于给定的 IP 网络,255.255.255.240 是子网掩码 IP 地址。
is_netmask_ip()
is_netmask_ip() 函数接受 ipaddress 作为输入。如果指定值是有效的子网掩码 IP 地址,则返回 True。
示例 1:
函数
is_netmask_ip(255.255.255.240) 返回 True,因为指定的值是有效的子网掩码 IP 地址。
示例 2:
函数
is_netmask_ip(255.255.255.232) 返回 False,因为指定的值不是有效的子网掩码 IP 地址。
broadcast_ip()
函数
broadcast_ip() 返回指定 IP 网络的广播 IP 地址。
示例:
函数
broadcast_ip(1.1.1.1/28) 返回 1.1.1.15。对于给定的 IP 网络,1.1.1.15 是广播 IP 地址。
cidr() 函数
函数
cidr() 返回指定 IP 网络的 CIDR 表示法。
示例:
函数
cidr(1.1.1.1/28) 返回 1.1.1.0/28。对于给定的 IP 网络,1.1.1.0/28 是 CIDR 表示法。
is_cidr()
函数
is_cidr() 接受 ipnetwork 作为输入。如果指定值与 IP 网络的 CIDR 表示法匹配,则返回 True。
示例-1:
函数
is_cidr(1.1.1.0/24) 返回 True,因为指定值是给定网络的 CIDR 表示法。
示例-2:
因为给定网络的 CIDR 表示与指定值不同,所以
is_cidr(1.1.1.1/28) 函数返回 False。
is_in_network()
is_in_network() 函数接受 ipnetwork 和 ipaddress 值。如果指定的 IP 地址存在于指定的 IP 网络中,则返回 True。
示例-1:
因为
1.1.1.121 地址是 1.1.1.1/24 网络的一部分,所以 is_in_network(1.1.1.1/24, 1.1.1.121) 函数返回 True。
示例-2:
因为
2.1.1.1 地址不属于 1.1.1.1/28 网络,所以 is_in_network(1.1.1.1/28, 2.1.1.1) 函数返回 Fasle。
base64.encode()
base64.encode() 函数接受一个字符串参数并返回 base64 编码的字符串。
示例:
base64.encode("abcd") 函数返回 YWJjZA==。
base64.decode()
base64.decode 函数接受一个 base64 编码的字符串作为参数并返回解码后的字符串。
示例:
base64.decode("YWJjZA==") 函数返回 abcd。
存在()
exists() 函数接受任意类型的参数并返回布尔值。如果输入有任何值,则返回值为 True。如果输入参数没有值(即,无值),则返回值为 False。
假设
$parameters.monitor 是一个可选参数。如果您在创建配置包时为此参数提供值,则 ($parameters.monitor) 函数返回 True。
否则,它返回
False。
筛选()
filter() 函数接受两个参数。
参数 1:一个替换函数,它接受一个参数并返回布尔值。
参数 2:一个列表。
该函数返回原始列表的一个子集,其中每个元素在传递给第一个 参数中的替换函数时,评估结果为
True。
示例:
假设我们定义了一个替换函数如下。
替换:
x(a): $a != 81
如果输入值不等于
81,此函数返回 True。否则,它返回 False。
假设,
$parameters.ports 是 [81, 80, 81, 89]。
filter($substitutions.x, $parameters.ports) 通过删除列表中所有出现的 81,返回 [80, 89]。
如果-那么-否则()
函数
if-then-else() 接受三个参数。
参数 1:一个布尔表达式
参数 2:任何表达式
参数 3:任何表达式(可选)
如果参数 1 中的表达式评估为
True,则函数返回作为参数 2 提供的表达式的值。
否则,如果提供了参数 3,函数返回参数 3 中表达式的值。
如果未提供参数 3,函数返回
no。
示例 1:
if-then-else($parameters.servicetype == HTTP, 80, 443) 函数在 $parameters.servicetype 的值为 HTTP 时返回 80。否则,函数返回 443。
示例 2:
if-then-else($parameters.servicetype == HTTP, $parameters.hport, $parameters.sport) 函数在 $parameters.servicetype 的值为 HTTP 时返回 $parameters.hport 的值。
否则,函数返回
$parameters.sport 的值。
示例 3:
if-then-else($parameters.servicetype == HTTP, 80) 如果 $parameters.servicetype 的值为 HTTP,则返回 80。
否则,该函数不返回任何值。
连接()
join() 函数接受两个参数:
参数 1:一个包含
number、tcp-port、string、ipaddress 的列表
参数 2:分隔符字符串(可选)
此函数将作为参数 1 提供的列表元素连接成一个字符串,其中每个元素都由作为参数 2 提供的分隔符字符串分隔。如果未提供参数 2,则列表中的元素将连接成一个字符串。
示例:
-
$parameters.ports是[81, 82, 83]。-
带分隔符参数:
join($parameters.ports, '-')函数返回81-82-83。 -
不带分隔符参数:
join($parameters.ports)函数返回818283。
-
拆分()
split() 函数根据指定的分隔符将输入字符串拆分为多个列表。如果未指定分隔符或指定为空白 ('') 分隔符,此函数会将空格视作分隔符,并将字符串拆分为列表。
示例:
-
split('Example_string_split', 's')函数返回['Example_','tring_','plit']。 -
split('Example string split')函数返回['Example','string','split']。 -
split('Example string split', '')函数返回['Example','string','split']。 -
split('Example string')函数返回['Example','string']。此函数将连续空格视作一个空格。
映射()
map() 函数接受两个参数;
参数 1:任意函数
参数 2:元素列表
该函数返回一个列表,其中列表中的每个元素都是将
map() 函数(参数 1)应用于参数 2 中相应元素的结果。
参数 1 中允许的函数:
-
接受一个参数的内置函数:
base64.encode, base64.decode, bin, bool, exists, hex, int, ip, len, lower, upper, oct, quotewrap, str, trim, upper, url.encode, url.decode -
替换函数,它们至少接受一个参数。
示例:
假设 $parameters.nums 为
[81, 82, 83]。
-
使用内置函数 str 进行映射
map(str, $parameters.nums)函数返回["81", "82", "83"]映射函数的结果是字符串列表,其中每个字符串元素都是通过对输入列表 ($parameters.nums) 中的相应元素应用 str 函数计算得出的。 -
使用替换函数进行映射
-
替换:
add-10(port): $port + 10 -
表达式:
map($substitutions.add-10, $parameters.nums)函数返回一个数字列表:[ 91, 92, 93 ]
-
此映射函数的结果是一个数字列表。每个元素都是通过对输入列表
($parameters.nums) 中的相应元素应用替换函数 $substitutions.add-10 计算得出的。
quotewrap() 函数
quotewrap() 函数接受一个字符串作为参数,并在输入值前后添加双引号字符后返回一个字符串。
示例:
quotewrap("NetScaler Console") 函数返回 "NetScaler Console"
替换()
replace() 函数接受三个参数:
参数 1:
string 或以下内置类型的列表:
-
string -
number -
ipaddress -
tcp-port -
boolean
参数 2:单个值或值列表,其类型与参数 1 中指定的类型匹配
参数 3:与参数 1 中指定的类型相同的单个值(可选)
replace() 函数将参数 1 中参数 2 的所有出现替换为参数 3。
如果未提供参数 3,则参数 1 中参数 2 的所有出现都将被删除。
示例:
-
replace('abcdef', 'def', 'xyz')函数返回abcxyz。def的所有出现都替换为xyz。 -
replace('abcdefabc', 'def')返回abcabc。由于没有参数 3,def将从结果字符串中删除。 -
replace('An#example@to%replace!characters', ['@', '#', '!', '%'], '_')函数返回An_example_to_replace_characters。输出字符串使用下划线 (_) 代替['@', '#', '!', '%']中指定的字符。 -
replace([10.10.10.1, 10.10.10.2, 10.10.10.3, 10.10.10.4], [10.10.10.2, 10.10.10.4])函数返回[10.10.10.1, 10.10.10.3]。由于没有参数 3,10.10.10.2和10.10.10.4将从结果 IP 地址列表中删除。 -
replace([8080, 8081, 8082, 8083, 8084], 8083, 80)函数返回[8080, 8081, 8082, 80, 8084]。8083的所有出现都替换为80。
修剪()
trim() 函数返回一个字符串,其中输入字符串的前导和尾随空格已被去除。
示例:
trim(' abc ') 函数返回 abc。
截断()
truncate() 函数接受两个参数:
参数 1:一个字符串
参数 2:一个数字
此函数返回一个字符串,其中参数 1 中的输入字符串被截断为参数 2 指定的长度。
示例:
truncate('Stylebooks', 6) 返回 Styleb。
去重()
distinct() 函数从列表输入中提取唯一项。
示例: 如果
$parameters.input_list 是 ['ADC', 'VPX', 'ADC', 'CPX'],则 distinct($parameters.input_list) 函数返回 ['ADC', 'VPX', 'CPX']。
url.encode()
url.encode() 函数返回一个字符串,其中字符根据 RFC 3986 使用 ASCII 字符集进行转换。
示例:
url.encode("a/b/c") 函数返回 a%2Fb%2Fc。
url.decode()
url.decode() 函数返回一个字符串,其中 URL 编码的参数根据 RFC 3986 解码为常规字符串。
示例:
url.decode("a%2Fb%2Fc") 函数返回 a/b/c。
is-ipv4() 函数
is-ipv4() 函数将 IP 地址作为参数,如果 IP 地址是 IPv4 格式,则返回布尔值 True。
is-ipv4(10.10.10.10) 函数返回 True
is-ipv6() 函数
is-ipv6() 函数将 IP 地址作为参数,如果 IP 地址是 IPv6 格式,则返回布尔值 True。
is-ipv6(2001:DB8::) 函数返回 True
以...开头()
startswith() 函数确定字符串是否以给定前缀开头。此函数需要两个强制字符串参数。
startswith(str, sub_str)
当字符串 (
str) 以子字符串 (sub_str) 开头时,此函数返回 True。
示例:
-
startswith('Citrix', 'Ci')函数返回True。 -
startswith('Citrix', 'iC')函数返回False -
startswith('Citrix', 'Ab')函数返回False
结束于()
endswith() 函数用于确定字符串是否以给定后缀结尾。此函数需要两个强制性字符串参数。
endswith(str, sub_str)
当字符串 (
str) 以子字符串 (sub_str) 结尾时,此函数返回 True。
示例:
-
endswith('Citrix', 'ix')函数返回True。 -
endswith('Citrix', 'Ix')函数返回False。 -
endswith('Citrix', 'ab')函数返回False。
包含()
contains() 函数用于确定字符串是否包含给定子字符串。此函数需要两个强制性字符串参数。
允许的参数类型:
-
string -
number -
tcp-port -
boolean -
ipaddress
contains(str, sub_str)
当子字符串(
sub_str)包含在字符串(str)中的任何位置时,此函数返回True。
示例:
-
此
contains('Citrix', 'tri')函数返回True。 -
此
contains('Citrix', 'Ci')函数返回True。 -
此
contains('Citrix', 'ti')函数返回False
您还可以使用此函数来检查给定项是否属于该列表。
示例:
list_of_strings = [“Citrix”, “Core”, ”Values”, ”Integrity”]
contains($parameters.list_of_strings, “Values”)
在此示例中,
contains()函数返回True,因为列表中包含Values项。
子字符串()
使用
substring()函数从字符串中提取子字符串。
substring(str, start_index, end_index)
此函数需要两个强制参数以及一个可选的整数参数。
-
str(强制) -
start_index(必填) -
end_index(可选)
此函数从字符串 (
str) 中返回指定索引位置之间的子字符串。如果未指定结束索引位置,则该函数将从开始索引提取子字符串直到字符串末尾。
注意
当您指定
end_index 时,子字符串将排除 end_index 位置处的字符。
示例:
-
substring('Citrix', 2)函数返回trix -
substring('Citrix', 10)函数返回 (")在此示例中,该函数返回一个空字符串,因为它具有无效的start_index位置。 -
substring('Citrix', 2, 4)函数返回tr在此示例中,该函数提取索引位置 2 和 4 之间的字符。 -
substring('Citrix', -3)函数返回rix如果要提取字符串末尾的字符,请为start_index参数指定一个负值。在此示例中,该函数提取包含字符串中最后三个字符的子字符串。
匹配()
match() 函数检查输入字符串是否与定义的正则表达式模式匹配。此函数接受正则表达式模式和搜索字符串作为参数。可选地,您还可以指定布尔类型以忽略区分大小写的模式。
示例:
-
match(“\^[A-Z0-9]{2}_[A-Z0-9]{2,10}$”, “A2_B2”)返回True。 -
match(“\^[A-Z0-9]{2}_[A-Z0-9]{2,10}$”, “a2_b2”)返回False。 -
match(“\^[A-Z0-9]{2}_[A-Z0-9]{2,10}$”, “a2_B2”, $parameters.ignore_case)返回True。
sha256()
使用此函数计算任何字符串的 SHA-256 哈希值。此函数接受任意长度的字符串输入,并返回固定长度(64 个字符)的哈希字符串。
示例:
components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: sha256(lbserver-name)
servicetype: SSL
ipv46: 10.10.10.10
在此示例中,
lbserver-name 在 NetScaler 对象上显示为哈希字符串。
此函数还可以接受表达式作为输入。
示例:
components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: sha256($parameters.lb-appname)
servicetype: SSL
ipv46: 10.10.10.10
关联()
relate() 函数从一组列表中形成字典对象列表。
它接受两个参数:
参数 1:表示键名称的字符串列表。
参数 2:一个列表的列表,其中每个列表包含参数 1 中相应键名称的值。参数 2 中的每个列表必须具有相同的长度。参数 2 中的列表数量应等于参数 1 中字符串的数量。
示例:
name: test_relate_3
description: "Hello World StyleBook."
namespace: com.citrix.adc.stylebooks
schema-version: "1.0"
version: "1.1"
import-stylebooks:
-
namespace: netscaler.nitro.config
prefix: ns
version: "10.5"
-
namespace: com.citrix.adc.stylebooks
prefix: stlb
version: "1.0"
parameters:
-
name: namesofservers
description: "Provide the names of LB VServers"
type: string[]
-
name: listofips
description: "Provide the list of IP Addresses"
type: string[]
-
name: list_of_keys
type: string[]
default:
- "name"
- "ip"
substitutions:
list_of_values: [$parameters.namesofservers,$parameters.listofips]
components:
-
name: svc-comp
type: object
properties:
svcdetails: relate($parameters.list_of_keys,$substitutions.list_of_values)
-
name: lb-comp
type: ns::lbvserver
repeat: $components.svc-comp.properties.svcdetails
repeat-item: svcd
properties:
name: $svcd['name']
servicetype: HTTP
ipv46: $svcd['ip']
port: 80
在此示例中:
-
parameters部分有一个名为list_of_keys的列表,其中包含name和ip。 -
substitutions部分有一个名为list_of_values的列表,其中包含以下两个列表:-
虚拟服务器名称列表 (
string) -
IP 地址列表 (
string)。
-
relate() 内置函数接受 list_of_keys 和 list_of_values 作为参数。然后,该函数创建一个字典对象列表,其中每个对象都包含第一个列表中的名称和第二个列表中的 IP 地址。
如果您提供以下虚拟服务器列表:
["lb1","lb2"]
以及虚拟服务器 IP 地址列表,如下所示:
["1.1.1.1","2.2.3.3"]
然后,
relate() 函数返回以下列表:
[\{"name": "lb1", "ip": "1.1.1.1"},\{"name": "lb2", "ip": "2.2.3.3"}]
StyleBook 在
components 部分中遍历此字典对象列表,以创建相应的虚拟服务器。
多重()
multiple() 函数接受两个参数:
参数 1:一个
number、string、boolean、ipaddress、tcp-port 或 password
参数 2:一个
number
multiple(argument1, argument2) 函数返回一个列表,其中包含参数 1 的多个副本。副本的数量等于传递给参数 2 的数量。
示例:
-
multiple(10.10.10.10, 3)函数返回[10.10.10.10, 10.10.10.10, 10.10.10.10]。 -
multiple(8080, 4)函数返回[8080, 8080, 8080, 8080]。
反转()
reverse() 函数将项目列表作为参数,并返回一个包含相同项目但按相反顺序排列的列表。
参数可以是以下内置类型的列表:
-
字符串
-
数字
-
IP 地址
-
IP 网络
-
TCP 端口
-
布尔值
-
密码
-
对象
-
文件
-
证书文件
-
密钥文件
-
证书密钥
示例: