substitutions
替换用于定义可以替换样书中复杂表达式的速记名称,从而使样书更具可读性。
在样书中重复使用相同的表达式或值(例如常量值)时,替换也很有用。使用参数的替代名称允许您仅更新替换值,而不是更新样书中出现的所有可能出错的参数。
替换还用于定义值之间的映射,如本文档中后面的示例中所述。
列表中的每个替换都由一个关键字和一个值组成。值可以是简单值、表达式、函数或映射。
在以下示例中,定义了两个替换。第一个为 http-port
,可以用作 8181 的简写。通过使用替换,可以在样书的其余部分以 $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
参数的布尔值指定为“true”,或者在 NetScaler 控制台 GUI 中选中与该参数对应的复选框,则会为该组件的 servicetype
属性分配值 SSL,并将端口属性的值分配为 443。但是,如果用户为此参数指定“假”或在 NetScaler 控制台 GUI 中清除相应的复选框,则会为 servicetype
属性分配值 HTTP,并将该端口的值 指定为 80。
以下示例说明了如何将替换用作函数。替换函数可以接受一个或多个参数。 参数可以是简单类型,例如,字符串、数字、ipaddress
、布尔型和其他类型。
替换:
form-lb-name(名称):$name +“-lb”
在此示例中,我们定义了一个替换函数“form-lb-name”,该函数接受一个名为“name”的字符串参数,并使用它来创建一个在名称参数中的字符串后缀“-lb”的字符串。使用此替换函数的表达式可以编写如下:
$substitutions.form-lb-name("my")
它返回 my-lb
看看另外一个示例:
替换:
cspol-priority(priority): 10100 - 100 * $priority
替换 cspol-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
- 如果映射中没有键,则该表达式不返回任何值
遍历替代列表
在以下示例中,样书遍历名为 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"]
<!--NeedCopy-->