样书配置

内置函数

样书中的表达式可以使用内置函数。

例如,您可以使用内置函数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.afalse、空值或不存在,bool($parameters.a)函数将返回false

len()

len()函数将字符串或列表作为参数,并返回字符串中的字符数或列表中的项目数。

示例 1

如果按以下所示定义 substitution:

items: ["123", "abc", "xyz"]

len($substitutions.items)函数返回3

示例 2

len("NetScaler ADM")函数返回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 ADM")函数返回NetScaler ADM

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.1ip_network($parameters.ipaddr, 30)函数返回1.1.1.1/30

示例 3

假设$parameters.netmask-len的值为24ip_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()函数接受ipnetworkipaddress值。而且,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有值HTTPif-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:numbertcp-portstringipaddress的列表

参数 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")函数返回"mas"

替换 ()

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', ['@', '//m.giftsix.com/docs/zh-cn/citrix-application-delivery-management-service/stylebooks/stylebooks-grammar/#', '!', '%'], '_')函数返回An_example_to_replace_characters

    输出字符串使用下划线 (_) 而不是['@', '//m.giftsix.com/docs/zh-cn/citrix-application-delivery-management-service/stylebooks/stylebooks-grammar/#', '!', '%']中指定的字符。

  • 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.210.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 ADM', 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”)

在此示例中,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-comptype:ns::lbvserverproperties:name:sha256(lbserver-name)servicetype:SSLipv46:10.10.10.10

在本示例中,lbserver-name在 ADC 对象上显示为哈希字符串。

此函数还可以接受表达式作为输入。

示例

components:-name:lbvserver-comptype:ns::lbvserverproperties:name:sha256($parameters.lb-appname)servicetype:SSLipv46:10.10.10.10

relate()

relate()函数从一组列表中形成字典对象的列表。

它需要两个参数:

参数 1:表示键名的字符串列表。

参数 2:列表列表,其中每个列表都有参数 1 中相应键名的值。参数 2 中的每个列表必须具有相同的长度。参数 2 中的列表数应等于参数 1 中的字符串数。

示例

name:test_relate_3description:"HelloWorldStyleBook."namespace:com.citrix.adc.stylebooksschema-version:"1.0"version:"1.1"import-stylebooks:-namespace:netscaler.nitro.configprefix:nsversion:"10.5"-namespace:com.citrix.adc.stylebooksprefix:stlbversion:"1.0"parameters:-name:namesofserversdescription:"ProvidethenamesofLBVServers"type:string[]-name:listofipsdescription:"ProvidethelistofIPAddresses"type:string[]-name:list_of_keystype:string[]default:-"name"-"ip"substitutions:list_of_values:[$parameters.namesofservers,$parameters.listofips]components:-name:svc-comptype:objectproperties:svcdetails:relate($parameters.list_of_keys,$substitutions.list_of_values)-name:lb-comptype:ns::lbvserverrepeat:$components.svc-comp.properties.svcdetailsrepeat-item:svcdproperties:name:$svcd['name']servicetype:HTTPipv46:$svcd['ip']port:80

在此示例中:

  • parameters部分有一个名为list_of_keys的列表,其中包含nameip

  • substitutions部分有一个名为list_of_values的列表,其中包含以下两个列表:

    • 虚拟服务器名称列表 (string)
    • IP 地址列表 (string)。

relate()内置函数接受list_of_keyslist_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"}]

样书在components部分中遍历此字典对象列表,以创建相应的虚拟服务器。

multiple()

multiple()函数有两个参数:

参数 1:numberstringbooleanipaddresstcp-portpassword

参数 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]