StyleBook 配置

内置函数

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.afalse、空或缺失,则 bool($parameters.a) 函数返回 false

len()

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()

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

upper()

upper() 函数接受字符串作为参数,并返回相同字符串的大写形式。

示例

upper("NetScaler Console") 函数返回 NetScaler Console

sum()

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.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 值。如果指定的 IP 地址存在于指定的 IP 网络中,则返回 True

示例 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) 函数返回 False,因为 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()

exists() 函数接受任何类型的参数并返回布尔值。如果输入有任何值,则返回值为 True。如果输入参数没有值(即没有值),则返回值为 False

假设 $parameters.monitor 是一个可选参数。如果您在创建配置包时为此参数提供值,则 exists($parameters.monitor) 函数返回 True

否则,它返回 False

filter()

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()

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()

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()

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"]

    map 函数的结果是字符串列表,其中每个元素字符串都是通过将 str 函数应用于输入列表 ($parameters.nums) 中的相应元素计算得出的。

  • 使用替换函数进行映射

    • 替换项:

      add-10(port): $port + 10

    • 表达式:

      map($substitutions.add-10, $parameters.nums) 函数返回一个数字列表:[ 91, 92, 93 ]

此 map 函数的结果是一个数字列表。每个元素都是通过将替换函数 $substitutions.add-10 应用于输入列表 ($parameters.nums) 中的相应元素计算得出的。

quotewrap()

quotewrap() 函数接受字符串作为参数,并在输入值前后添加双引号字符后返回字符串。

示例

quotewrap("NetScaler Console") 函数返回 "NetScaler Console"

replace()

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,因此从结果 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() 函数返回一个字符串,其中输入字符串中的前导和尾随空格已被去除。

示例

trim(' abc ') 函数返回 abc

truncate()

truncate() 函数接受两个参数:

参数 1:字符串

参数 2:数字

该函数返回一个字符串,其中参数 1 中的输入字符串被截断为参数 2 指定的长度。

示例

truncate('Stylebooks', 6) 返回 Styleb

distinct()

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() 函数确定字符串是否以给定前缀开头。此函数需要两个强制字符串参数。

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 的列表,其中包含 nameip

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

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

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

StyleBook 遍历此字典对象列表,在 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]

reverse()

reverse() 函数接受项目列表作为参数,并返回一个包含相同项目但按相反顺序排列的列表。

参数可以是以下内置类型列表:

  • string
  • number
  • ipaddress
  • ipnetwork
  • tcp-port
  • boolean
  • password
  • object
  • file
  • certfile
  • keyfile
  • certkey

示例

  • reverse([10.102.20.1, 10.102.20.2, 10.102.20.3]) 返回 [10.102.20.3, 10.102.20.2, 10.102.20.1]
  • reverse([80,81,82,81]) 返回 [81,82,81,80]
  • reverse([‘app-mx’,’app-cx’,’conf-27’,’app3’]) 返回 [‘app3’,’conf-27’,’app-cx’,’app-mx’]