替换
substitutions 部分用于定义可在样本其余部分使用的复杂表达式的简写名称,以使样本更加清晰。在样本中多次重复使用相同表达式或值(例如,一个常数值)时,它们也很有用。为此值使用替代名称,您只能在需要更改此值时更新替换值,而不是在样书中显示的每个位置更新替换值,这可能容易出错。
替换还用于定义值之间的映射,如本文档中后面的示例中所述。
列表中的每个替换都由一个关键字和一个值组成。值可以是简单值、表达式、函数或映射。
在以下示例中,定义了两个替换。第一个为http-port
,可以用作 8181 的简写。通过使用替换,可以在样本的其余部分以$substitutions.http-port引用它,而不是使用 8181。
替换:
http-port: 8181
这允许您为端口号指定助记符名称,并在样书中的一个位置定义此端口号,无论使用次数多少。如果要将端口号修改为 8080,则可以在替换部分对其进行修改,无论使用助记符名称http-port
的地方,更改都将生效。以下示例说明了如何在组件中使用替换。
components:-name:my-lbvserver-comptype:ns::lbvserverproperties:name:$parameters.name + "-lb"servicetype:HTTPipv46:$parameters.ipport:$substitutions.http-portlbmethod:$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
这意味着,如果样书的用户将布尔值指定为 “true” 参数是安全的,或者选中 Citrix ADM GUI 中与此参数对应的复选框,则此组件的servicetype
属性将被分配值SSL,端口属性为分配了值443。但是,如果用户为此参数指定 “false” 或清除 Citrix ADM GUI 中的相应复选框,则会为servicetype
属性分配值HTTP,端口将被分配值80。
以下示例说明了如何将替换用作函数。替换函数可以接受一个或多个参数。参数可以是简单类型,例如,字符串、数字、ipaddress
、布尔型和其他类型。
替换:
表单-LB 名称(名称):$名称 + “-lb”
在此示例中,我们定义了一个替换函数“form-lb-name”,它接受名为“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)
替换也可以由键和值组成。值可以是简单值、表达式、函数、映射、列表或字典。
以下是一个名为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 虚拟服务器可能具有相同的配置,因此您可以使用替代列表和字典构建此配置,以避免为每台 lb 虚拟服务器重复该配置。
以下示例显示了cs-lb-mon
样书中用于创建内容交换虚拟服务器配置的替代和组件。在构建cs-lb-mon
样书的属性时,复杂的替代 “lb-properties” 指定了与 cs 虚拟服务器关联的 lb 虚拟服务器的属性。“lb-properties”替换是一个函数,接受名称、服务类型、虚拟 IP 地址、端口和服务器作为参数,并生成键值对作为值。在cs-pools
组件中,我们将此替换的值分配给每个池的 lb-pool 参数。
替换:cs-port[]:真:int(“80”)错误:我nt("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。要检索作为参数提供的特定协议的端口,请使用表达式
美元替换[$parameters.protocol]
该表达式根据用户指定的协议返回值。
- 如果键为 HTTP,则表达式返回 80
- 如果键为 DNS,则表达式返回 53
- 如果键为 SSL,则表达式返回 443
- 如果映射中没有键,则该表达式不返回任何值