Application Delivery Management

substitutions

substitutions 部分用于定义可在样本其余部分使用的复杂表达式的简写名称,以使样本更加清晰。在样本中多次重复使用相同表达式或值(例如,一个常数值)时,它们也很有用。通过为此值使用替换名称,您可以在需要更改此值时只更新替换值,而不是在样本中出现的每一处更新它(这很容易出错)。

替换还用于定义值之间的映射,如本文档中后面的示例中所述。

列表中的每个替换都由一个关键字和一个值组成。值可以是简单值、表达式、函数或映射。

在以下示例中,定义了两个替换。第一个替换是可以用作 8181 的简写名称的“http-port”。通过使用替换,可以在样书的其余部分以 $substitutions.http-port 引用它,而不是使用 8181。

替换

  http-port: 8181

这让您可以为端口号指定助记名称,并在样书中的一个地方定义此端口号,无论它被使用多少次。如果要将端口号修改为 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
<!--NeedCopy-->

替换也可以是复杂的表达式。以下示例说明了两个替换如何使用表达式。

substitutions:
  app-rule: HTTP.REQ.HEADER("X-Test-Application").EXISTS
  app-name: str("acme-") + $parameters.name + str("-app")
<!--NeedCopy-->

替换表达式还可以使用现有替换表达式,如以下示例中所示。

substitutions:
  http-port: 8181
  app-name: str("acme-") + $parameters.name + str($substitutions.http-port) + str("-app")
<!--NeedCopy-->

替换的另一个有用功能是映射,即可以将关键字映射到值。下面是一个映射替换示例。

substitutions:
    secure-port:
        true: int("443")
        false: int("80")
    secure-protocol:
        true: SSL
        false: HTTP
<!--NeedCopy-->

以下示例说明了如何使用映射 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
<!--NeedCopy-->

这意味着,如果样书的用户将参数 is-secure 的布尔值指定为“真”,或者在 Citrix ADM GUI 中选中与该参数对应的复选框,则会为该组件的服务类型属性分配 值 SSL,并将端口属性的值 分配为 443。 但是,如果用户为此参数指定“假”或清除 Citrix ADM GUI 中的相应复选框,则会为服务类型属性分配 值 HTTP,并将端口的值 分配为 80

以下示例说明了如何将替换用作函数。替换函数可以接受一个或多个参数。参数应属于简单类型,例如,字符串、数字、IP 地址、布尔值和其他类型。

替换

  form-lb-name(name): $name + “-lb”

在此示例中,我们定义了一个替换函数“form-lb-name”,它接受一个名为“name”的字**符串参数, 并使用它来创建一个新字符串,该字符串在名称参数中为该字符串添加后缀“-lb”。使用此替换函数的表达式可以编写如下:

$substitutions.form-lb-name(“my”)

此表达式返回“my-lb”

看看另外一个示例:

替换

    cspol-priority(priority): 10100 - 100 * $priority

替换 cspol-priority 是一个函数,它接收名为 priority 的参数,并使用它来计算值。在样书的其余部分,可以使用此替换,如以下示例中所示:

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)
<!--NeedCopy-->

替换也可以由键和值组成。值可以是简单值、表达式、函数、映射、列表或字典。

以下是名为“slist”的替换示例,其值为列表:

substitutions:
  slist:
    - a
    - b
    - c
<!--NeedCopy-->

替换的值还可以是键值对字典,如以下示例中所示,这是名为“sdict”的替换:

substitutions:
  sdict:
    a: 1
    b: 2
    c: 3
<!--NeedCopy-->

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

  slistofdict:
    -
      a: $parameters.cs1.lb1.port
      b: $parameters.cs1.lb2.port
    -
      a: $parameters.cs2.lb1.port
      b: $parameters.cs2.lb2.port
<!--NeedCopy-->

但是,在以下示例中,名为“sdictoflist”的替换返回一个键值对,其中值本身是另一个列表。

  sdictoflist:
    a:
      - 1
      - 2
    b:
      - 3
      - 4
<!--NeedCopy-->

在组件中,这些替换可以用于 condition、properties、repeat、repeat-condition 构造中。

以下组件示例显示了如何使用替换指定属性:

    properties:
      a: $substitutions.slist
      b: $substitutions.sdict
      c: $substitutions.slistofdict
      d: $substitutions.sdictoflist
<!--NeedCopy-->

定义其值是列表或字典的替换的用例是当您配置一个内容交换虚拟服务器和多个负载平衡虚拟服务器时。由于绑定到同一 cs 虚拟服务器的所有 lb 虚拟服务器可能有相同的配置,因此,您可以使用替换列表和字典来构建此配置以避免对每个 lb 虚拟服务器重复使用该配置。

以下示例显示 cs-lb-mon 样本中用于创建内容交换虚拟服务器配置的替换和组件。构建 cs-lb-mon 样本的属性时,复杂的替换“lb-properties”指定与 cs 虚拟服务器关联的 lb 虚拟服务器的属性。“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
<!--NeedCopy-->

替代映射

您可以创建将键映射到值的替换。例如,假设这样一个场景:您想要定义要用于每个协议(键)的默认端口(值)。对于此任务,按如下所示编写替换映射。

substitutions:
     port:
          HTTP: 80
          DNS: 53
          SSL: 443
<!--NeedCopy-->

在此示例中,HTTP 映射到 80,DNS 映射到 53,SSL 映射到 443。要检索作为参数提供的特定协议的端口,请使用表达式

$substitutions.port[$parameters.protocol]

该表达式根据用户指定的协议返回值。

  • 如果键为 HTTP,则表达式返回 80
  • 如果键为 DNS,则表达式返回 53
  • 如果键为 SSL,则表达式返回 443
  • 如果映射中没有键,则该表达式不返回任何值
substitutions