自動置換
置換を使用すると、StyleBook内の複雑な式を置き換えることができる省略名を定義できるため、StyleBookが読みやすくなります。
置換は、定数値など、StyleBookで同じ式や値を繰り返し使用する場合にも便利です。パラメータに代替名を使用すると、エラーが発生しやすいStyleBook内のパラメータのすべてのオカレンスを更新する代わりに、代替値のみを更新できます。
置換は、値間のマッピングを定義するためにも使用されます。
一覧の各置換はキーと値で構成されます。値には、単純な値、式、関数、またはマップを指定できます。
次の例では、2つの置換が定義されています。最初のhttp-port
は8181の短縮形として使用できます。置換を使用することで、この値をStyleBookのほかの部分で、8181ではなく$substitutions.http-portとして参照できるようになります。
置換:
http-port: 8181
ポート番号にニーモニック名を指定し、そのポート番号をStyleBookの1か所で定義できます。使用回数には関係ありません。ポート番号を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-->
置換は複雑な式にすることもできます。次の例は、2つの置換で式を使用する方法を示しています。
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-->
置換のもう1つの便利な機能がマップで、キーを値にマップできます。以下は、マップ置換の例です。
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-->
つまり、StyleBookのユーザーがパラメーターis-secureにブール値「true」を指定するか、NetScaler ADM GUIでこのパラメーターに対応するチェックボックスを選択すると、このコンポーネントのservicetype
プロパティにはSSLという値が割り当てられ、port
プロパティには443という値が割り当てられます。 ただし、ユーザーがこのパラメーターに「false」を指定するか、NetScaler ADM GUIservicetype
の対応するチェックボックスをオフにすると、 HTTPの値が割り当てられ 、ポートには80の値が割り当てられます。
次の例は、置換を関数として使用する方法を示しています。置換関数は1つまたは複数の引数を取ることができます。引数には、文字列、数値、IP アドレス、ブール値などの単純な型を使用できます。
置換:
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)
<!--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-->
コンポーネントでは、これらの置換を条件、プロパティ、リピート、およびリピート条件の構成要素で使用できます。
次のコンポーネントの例は、置換を使用してプロパティを指定する方法を示しています。
properties:
a: $substitutions.slist
b: $substitutions.sdict
c: $substitutions.slistofdict
d: $substitutions.sdictoflist
<!--NeedCopy-->
値が一覧またはディクショナリの置換を定義するユースケースは、コンテンツスイッチ仮想サーバーや複数の負荷分散仮想サーバーを構成する場合です。同じコンテンツスイッチング仮想サーバーに関連付けられているすべての負荷分散仮想サーバーは同じ構成になっている可能性があるため、すべての負荷分散仮想サーバーで同じ構成を繰り返さないように、代替リストと辞書を使用して構成を構築してください。
次の例は、 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
<!--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を返します。
- キーがマップに存在しない場合、式は値を返しません
置換リストを反復処理
次の例では、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"]
<!--NeedCopy-->