内置函数
样书中的表达式可以使用内置函数。
例如,您可以使用内置函数 str()
将数字转换为字符串。
str($parameters.order)
或者,您可以使用内置函数 int()
将字符串转换为整数。
int($parameters.priority)
下面是样书表达式中支持的内置函数列表以及这些函数的用法示例。
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(T rue)
函数返回"T rue"
。 -
str(ADM)
函数返回"mas"
。
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()
len()
函数将字符串或列表作为参数,并返回字符串中的字符数或列表中的项目数。
示例 1:
如果按以下所示定义 substitution:
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()
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()
该 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()
函数将数字作为参数,并返回一个以二进制格式表示数字的字符串。
表达式示例:
bin(100)
函数返回 0b1100100
。
oct()
oct()
函数将数字作为参数,并返回一个字符串,该字符串以八进制格式表示该数字。
表达式示例:
oct(100)
函数返回 0144
。
hex()
hex()
函数接受一个数字作为参数,并返回一个小写字符串,该字符串表示十六进制格式的数字。
表达式示例:
hex(100)
函数返回 0x64
。
lower()
lower()
函数接受一个字符串作为参数,并以小写形式返回相同的字符串。
示例:
lower("ADM")
函数返回 adm
。
upper()
upper()
函数接受一个字符串作为参数,并以大写形式返回相同的字符串。
示例:
upper("NetScaler Console")
函数返回 NetScaler Console
。
sum()
sum()
函数接受数字列表或 tcpports
作为参数并返回列表中数字的总和。
示例 1:
如果按如下方式定义替 代:替代:
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()
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:
is_cidr(1.1.1.1/28)
函数返回 False
,因为给定网络的 CIDR 表示法与指定的值不同。
is_in_network()
is_in_network()
函数接受 ipnetwork
和 ipaddress
值。而且, True
如果指定的 IP 地址存在于指定的 IP 网络中,它将返回。
示例 1:
is_in_network(1.1.1.1/24, 1.1.1.121)
函数返回 True
,因为 1.1.1.121
地址是 1.1.1.1/24
网络的一部分。
示例 2:
is_in_network(1.1.1.1/28, 2.1.1.1)
函数返回 Fasle
,因为 2.1.1.1
地址不是 1.1.1.1/28
网络的一部分。
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:接收一个参数并返回布尔值的 substitution 函数。
参数 2:列表。
传递给第一个参数中的替代函数时,
该函数返回每个元素计算结果为 True
的原始列表的一个子集。
示例:
假定按如下所示定义了 substitution 函数。
替换:
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:
如果 $parameters.servicetype
有值 HTTP
,则 if-then-else($parameters.servicetype == HTTP, 80, 443)
函数返回 80
。否则,函数返回 443
。
示例 2:
如果 $parameters.servicetype
有值 HTTP
,if-then-else($parameters.servicetype == HTTP, $parameters.hport, $parameters.sport)
函数返回 $parameters.hport
的值。
否则,函数返回 $parameters.sport
的值。
示例 3:
如果 $parameters.servicetype
有值 HTTP
,则 if-then-else($parameters.servicetype == HTTP, 80)
返回 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()
函数根据指定的分隔符将输入字符串拆分为多个列表。如果未指定或空白 (''
) 分隔符,则此函数将空格视为分隔符并将字符串拆分为列表。
示例:
-
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
-
至少接收一个参数的 substitution 函数。
示例:
假设 $parameters.nums 是 [81, 82, 83]
。
-
使用内置函数 str 的 map
map(str, $parameters.nums)
函数返回["81", "82", "83"]
map 函数的结果是字符串列表,其中的每个元素是对输入列表 ($parameters.nums) 中的对应元素应用 str 函数计算所得的字符串。
-
使用 substitution 函数的 map
-
替换:
add-10(port): $port + 10
-
表达式:
map($substitutions.add-10, $parameters.nums)
函数返回数字列表:[ 91, 92, 93 ]
-
这个映射函数的结果是一个数字列表。每个元素都是通过对输入列表 ($parameters.nums)
中的相应元素应用替换函数 $substitutions.add-10
来计算的。
报价包装 ()
quotewrap()
函数接受一个字符串作为参数,并在输入值之前和之后添加双引号字符后返回一个字符串。
示例:
quotewrap("ADM")
函数返回 "ADM"
替换 ()
replace()
函数有三个参数:
参数 1:以下内置类型的 string
或列表:
string
number
ipaddress
tcp-port
boolean
参数 2:类型与参数 1 中指定的类型匹配的单个值或值列表
参数 3:与参数 1 中指定的类型相同的单个值(可选)
replace()
函数用参数 1 中的参数 3 替换所有出现的参数 2。
如果未提供参数 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,因此已从结果的 IP 地址列表中删除
10.10.10.2
和10.10.10.4
。 -
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('NetScaler Console', 6)
返回 Citrix
。
distinct()
distinct()
函数从列表输入中提取唯一项目。
示例:
如果 $parameters.input_list
是 ['ADM', 'ADC', 'VPX', 'ADC', 'ADM', 'CPX']
,则 distinct($parameters.input_list)
函数返回 ['ADM', '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 地址作为参数, True
如果 IP 地址为 IPv6 格式,则返回布尔值。
is-ipv6(2001:DB8::)
函数返回 True
startswith()
startswith()
函数确定字符串是否以给定的前缀开头。此函数需要两个强制的字符串参数。
startswith(str, sub_str)
当字符串 (str
) 以子字符串 (sub_str
) 开头时,此函数返回 True
。
示例:
-
startswith('Citrix', 'Ci')
函数返回True
。 -
startswith('Citrix', 'iC')
函数返回False
-
startswith('Citrix', 'Ab')
函数返回False
endswith()
endswith()
函数确定字符串是否以给定的后缀结尾。此函数需要两个强制的字符串参数。
endswith(str, sub_str)
当字符串 (str
) 以子字符串 (sub_str
) 结尾时,此函数返回 True
。
示例:
-
endswith('Citrix', 'ix')
函数返回True
。 -
endswith('Citrix', 'Ix')
函数返回False
。 -
endswith('Citrix', 'ab')
函数返回False
。
contains()
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”)
<!--NeedCopy-->
在此示例中,contains()
函数返回 True
,因为列表中有 Values
项目。
substring()
使用 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()
函数检查输入字符串是否与定义的正则表达式模式相匹配。此函数接受正则表达式模式和搜索字符串作为参数。可选,您也可以指定布尔类型来忽略区分大小写的模式。
示例:
-
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
<!--NeedCopy-->
在此示例中, lbserver-name
在 NetScaler 对象上显示为哈希字符串。
此函数还可以接受表达式作为输入。
示例:
components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: sha256($parameters.lb-appname)
servicetype: SSL
ipv46: 10.10.10.10
<!--NeedCopy-->
relate()
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
<!--NeedCopy-->
在此示例中:
-
parameters
部分有一个名为list_of_keys
的列表,其中包含name
和ip
。 -
substitutions
部分有一个名为list_of_values
的列表,其中包含以下两个列表:- 虚拟服务器名称列表 (
string
) - IP 地址列表 (
string
)。
- 虚拟服务器名称列表 (
relate()
内置函数接受 list_of_keys
和 list_of_values
作为参数。然后,该函数创建字典对象列表,其中每个对象都有来自第一个列表的名称和第二个列表中的 IP 地址。
如果您提供以下虚拟服务器列表:
["lb1","lb2"]
<!--NeedCopy-->
以及虚拟服务器 IP 地址列表,如下所示:
["1.1.1.1","2.2.3.3"]
<!--NeedCopy-->
然后,relate()
函数返回以下列表:
[{"name": "lb1", "ip": "1.1.1.1"},{"name": "lb2", "ip": "2.2.3.3"}]
<!--NeedCopy-->
样书在 components
部分中遍历此字典对象列表,以创建相应的虚拟服务器。
multiple()
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]
。
在本文中
- str()
- int()
- bool()
- len()
- min()
- max()
- bin()
- oct()
- hex()
- lower()
- upper()
- sum()
- pow()
- ip()
- ip_network ()
- network_ip ()
- subnets()
- netmask_ip()
- is_netmask_ip()
- broadcast_ip()
- cidr()
- is_cidr()
- is_in_network()
- base64.encode()
- base64.decode()
- 存在 ()
- 筛选器 ()
- 如果-然后-否则 ()
- 连接 ()
- split()
- 地图 ()
- 报价包装 ()
- 替换 ()
- 修剪 ()
- 截断 ()
- distinct()
- url.encode()
- url.decode()
- is-ipv4 ()
- is-ipv6 ()
- startswith()
- endswith()
- contains()
- substring()
- match()
- sha256()
- relate()
- multiple()