替换

Last published : Oct 06, 2026
替换用于定义速记名称,这些名称可以替换 StyleBook 中的复杂表达式,从而使 StyleBook 更具可读性。
当 StyleBook 中重复使用相同的表达式或值(例如常量值)时,替换也很有用。为参数使用替换名称,您只需更新替换值,而无需更新 StyleBook 中参数的所有出现位置,这可能会导致错误。
替换还用于定义值之间的映射,如本文档后面示例中所述。
列表中的每个替换都由一个键和一个值组成。该值可以是简单值、表达式、函数或映射。
在以下示例中,定义了两个替换。第一个是 http-port,可用作 8181 的速记。通过使用替换,您可以在 StyleBook 的其余部分中将其引用为 $substitutions.http-port,而不是 8181。
替换:
http-port: 8181
这允许您为端口号指定一个助记名称,并在 StyleBook 的一个位置定义此端口号,无论它被使用了多少次。如果您想将端口号修改为 8080,您可以在替换部分进行修改,并且更改将在使用助记名称 http-port 的任何地方生效。以下示例显示了如何在组件中使用替换。
components:

 -

     name: my-lbvserver-comp

     type: ns::lbvserver

     properties:

          name: $parameters.name + "-lb"

          servicetype: HTTP

          ipv46: $parameters.ip

          port: $substitutions.http-port

          lbmethod: $parameters.lb-alg
替换也可以是复杂的表达式。以下示例显示了两个替换如何使用表达式。
substitutions:

  app-rule: HTTP.REQ.HEADER("X-Test-Application").EXISTS

  app-name: str("acme-") + $parameters.name + str("-app")
替换表达式还可以使用现有的替换表达式,如以下示例所示。
substitutions:

  http-port: 8181

  app-name: str("acme-") + $parameters.name + str($substitutions.http-port) + str("-app")
替换的另一个有用功能是映射,您可以在其中将键映射到值。以下是映射替换的示例。
substitutions:

    secure-port:

        true: int("443")

        false: int("80")

    secure-protocol:

        true: SSL

        false: HTTP
以下示例显示了如何使用映射 secure-port 和 secure-protocol。
components:

 -

     name: my-lbvserver-comp

     type: ns::lbvserver

     properties:

          name: $parameters.name + "-lb"

          servicetype: $substitutions.secure-protocol[$parameters.is-secure]

          ipv46: $parameters.ip

          port: $substitutions.secure-port[$parameters.is-secure]

          lbmethod: $parameters.lb-alg
在此,如果 StyleBook 用户为参数 is-secure 指定布尔值“true”,或在 NetScaler Console GUI 中选择与此参数对应的复选框,则此组件的 servicetype 属性将被赋值为 SSL,端口属性将被赋值为 443。但是,如果用户为此参数指定“false”或清除 NetScaler Console GUI 中对应的复选框,则 servicetype 属性将被赋值为 HTTP,端口将被赋值为 80。
以下示例显示了如何将替换用作函数。替换函数可以接受一个或多个参数。参数可以是简单类型,例如字符串、数字、ipaddress、布尔值和其他类型。
替换:
form-lb-name(name):该表达式的结果是 $name + "-lb"
在此示例中,我们定义了一个替换函数“form-lb-name”,它接受一个名为“name”的字符串参数,并使用它创建一个字符串,该字符串在 name 参数的字符串后添加“-lb”后缀。使用此替换函数的表达式可以写为:
$substitutions.form-lb-name("my")
它返回 my-lb
考虑另一个示例:
替换:
cspol-priority(priority): 10100 - 100 * $priority
替换 cspol-priority 是一个函数,它接受一个名为 priority 的参数,并用它来计算一个值。在 StyleBook 的其余部分中,此替换可以按以下示例所示使用:
components:

  -

    name: cspolicy-binding-comp

    type: ns::csvserver_cspolicy_binding

    condition: not $parameters.is-default

    properties:

         name: $parameters.csvserver-name

         policyname: $components.cspolicy-comp.properties.policyname

         priority: $substitutions.cspol-priority($parameters.pool.priority)
以下是名为 slist 的替换示例,其值是一个列表:
substitutions:

  slist:

    - a

    - b

    - c
替换的值也可以是键值对字典,如下面名为 sdict 的替换示例所示:
substitutions:

  sdict:

    a: 1

    b: 2

    c: 3
您可以通过组合列表和字典来创建更复杂的属性。例如,名为 slistofdict 的替换返回一个键值对列表。
  slistofdict:

    -

      a: $parameters.cs1.lb1.port

      b: $parameters.cs1.lb2.port

    -

      a: $parameters.cs2.lb1.port

      b: $parameters.cs2.lb2.port
但是,在以下示例中,替换 sdictoflist 返回一个键值对,其中值本身是另一个列表。
  sdictoflist:

    a:

      - 1

      - 2

    b:

      - 3

      - 4
在组件中,这些替换可用于 condition、properties、repeat、repeat-condition 构造。
以下组件示例展示了如何使用替换来指定属性:
    properties:

      a: $substitutions.slist

      b: $substitutions.sdict

      c: $substitutions.slistofdict

      d: $substitutions.sdictoflist
定义一个值为列表或字典的替换的用例是,当您配置内容交换虚拟服务器和多个负载均衡虚拟服务器时。由于所有绑定到同一内容交换虚拟服务器的负载均衡虚拟服务器可能具有相同的配置,因此您可以使用替换列表和字典来构建此配置,以避免为每个负载均衡虚拟服务器重复该配置。
以下示例展示了 cs-lb-mon StyleBooks 中的替换和组件,用于创建内容交换虚拟服务器配置。在构建 cs-lb-mon StyleBooks 的属性时,复杂的替换“lb-properties”指定了与内容交换虚拟服务器关联的负载均衡虚拟服务器的属性。“lb-properties”替换是一个函数,它将名称、服务类型、虚拟 IP 地址、端口和服务器作为参数,并生成一个键值对作为其值。在 cs-pools 组件中,我们将此替换的值分配给每个池的 lb-pool 参数。
substitutions:

  cs-port[]:

    true: int("80")

    false: int("443")

  lb-properties(name, servicetype, vip, port, servers):

    lb-appname: $name

    lb-service-type: $servicetype

    lb-virtual-ip: $vip

    lb-virtual-port: $port

    svc-servers: $servers

    svc-service-type: $servicetype

    monitors:

      -

        monitorname: $name

        type: PING

        interval: $parameters.monitor-interval

        interval_units: SEC

        retries: 3

components:

  -

    name: cs-pools

    type: stlb::cs-lb-mon

    description: | Updates the cs-lb-mon configuration with the different pools provided. Each pool with rule result in a dummy LB vserver, cs action, cs policy, and csvserver_cspolicy_binding configuration.

    condition: $parameters.server-pools

    repeat: $parameters.server-pools

    repeat-item: pool

    repeat-condition: $pool.rule

    repeat-index: ndx

    properties:

      appname: $parameters.appname + "-cs"

      cs-virtual-ip: $parameters.vip

      cs-virtual-port: $substitutions.cs-port($parameters.protocol == "HTTP")

      cs-service-type: $parameters.protocol

      pools:

        -

          lb-pool: $substitutions.lb-properties($pool.pool-name, "HTTP", "0.0.0.0", 0, $pool.servers)

          rule: $pool.rule

          priority: $ndx + 1

替换映射

您可以创建将键映射到值的替换。例如,考虑一个场景,您希望为每个协议(键)定义要使用的默认端口(值)。为此,请按如下方式编写替换映射。
substitutions:

     port:

          HTTP: 80

          DNS: 53

          SSL: 443
在此示例中,HTTP 映射到 80,DNS 映射到 53,SSL 映射到 443。要检索作为参数给定的某个协议的端口,请使用表达式
$substitutions.port
该表达式根据用户指定的协议返回值。
  • 如果键是 HTTP,表达式返回 80
  • 如果键是 DNS,表达式返回 53
  • 如果键是 SSL,表达式返回 443
  • 如果映射中不存在该键,表达式不返回任何值

遍历替换列表

在以下示例中,StyleBook 遍历名为 apps 的替换列表,以创建一组 lbvserver 组件及其相应的服务组和绑定服务器。
substitutions:
  apps:
    -
      name: lb1
      vip: 1.2.3.4
      vport: 80
      protocol: HTTP
      servers:
        -
          ip: 10.8.11.11
          port: 8080
        -
          ip: 10.8.11.12
          port: 8080
    -
      name: lb2
      vip: 1.2.3.5
      vport: 81
      protocol: HTTP
      servers:
        -
          ip: 10.9.11.28
          port: 8080
        -
          ip: 10.9.11.29
          port: 8181
components:
  -
    name: lbvserver-comp
    type: ns::lbvserver
    repeat: $substitutions.apps
    repeat-item: app
    properties:
      name: $app["name"]
      ipv46: $app["vip"]
      port: $app["vport"]
      servicetype: $app["protocol"]
    components:
      -
        name: servicegroup-comp
        type: ns::servicegroup
        properties:
          servicegroupname: $parent.properties.name + "-svg"
          servicetype: HTTP
        components:
          -
            name: servers-comp
            type: ns::server
            repeat: $app["servers"]
            repeat-item: server
            properties:
              name: $server["ip"]
              ipaddress: $server["ip"]
            components:
              -
                name: servicegroup-servicegroupmember-binding-comp
                type: ns::servicegroup_servicegroupmember_binding
                properties:
                  servicegroupname: $parent.parent.properties.servicegroupname
                  servername: $parent.properties.name
                  port: $server["port"]