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.a 为 false、空或缺失,则 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.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 值。如果指定的 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: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()

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.2 和 10.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 的列表,其中包含 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-->

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

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’]。