Application Delivery Management

置換

置換は、StyleBook内の複雑な式を置き換えることができる短縮名(ショートハンド名)を定義するために使用され、StyleBookの可読性を高めます。

置換は、StyleBook内で同じ式や値(例えば定数値)が繰り返し使用される場合にも役立ちます。パラメーターに置換名を使用することで、StyleBook内のパラメーターのすべての出現箇所を更新する代わりに、置換値のみを更新でき、エラーが発生しにくくなります。

置換は、値間のマッピングを定義するためにも使用されます。

リスト内の各置換は、キーと値で構成されます。値は、単純な値、式、関数、またはマップにすることができます。

次の例では、2つの置換が定義されています。最初のhttp-portは、8181の短縮名として使用できます。置換を使用することで、StyleBookの残りの部分で8181の代わりに$substitutions.http-portとして参照できます。

substitutions:

  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-portsecure-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 Console GUIでこのパラメーターに対応するチェックボックスを選択した場合、このコンポーネントのservicetypeプロパティには値SSLが割り当てられ、portプロパティには値443が割り当てられることを意味します。ただし、ユーザーがこのパラメーターに「false」を指定するか、NetScaler Console GUIで対応するチェックボックスをオフにした場合、servicetypeには値HTTPが割り当てられ、ポートには値80が割り当てられます。

次の例は、置換を関数として使用する方法を示しています。置換関数は、1つ以上の引数を取ることができます。引数は、文字列、数値、IPアドレス、ブール値などの単純な型にすることができます。

substitutions:

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

この例では、文字列引数「name」を取り、それを使用して「name」引数の文字列に「-lb」を付加する文字列を作成する置換関数「form-lb-name」が定義されています。この置換関数を使用する式は次のように記述されます。

$substitutions.form-lb-name("my")

これはmy-lbを返します。

別の例を考えてみましょう。

substitutions:

    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-->

コンポーネントでは、これらの置換はconditionpropertiesrepeat、およびrepeat-conditionの構成で使用できます。

コンポーネントの次の例は、置換を使用してプロパティを指定する方法を示しています。

    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-->
置換