式
StyleBook の最も強力な機能の 1 つは、式の使用です。StyleBook 式は、さまざまなシナリオで動的な値を計算するために使用できます。次の例は、パラメーター値をリテラル文字列と連結する式です。
例:
$parameters.appname + "-mon"
<!--NeedCopy-->
この式は、appname という名前のパラメーターを取得し、それを文字列 -mon と連結します。
次の種類の式がサポートされています。
算術式
- 加算 (+)
- 減算 (-)
- 乗算 (*)
- 除算 (/)
- 剰余 (%)
例:
- 2 つの数値の加算: $parameters.a + $parameters.b
- 2 つの数値の乗算: $parameters.a * 10
- ある数値を別の数値で除算した後の剰余の検索:
15%10 の結果は 5
文字列式
- 2 つの文字列の連結 (+)
例:
2 つの文字列を連結する: str(“app-“) + $parameters.appname
リスト式
2 つのリストをマージする (+)
例:
-
2 つのリストの連結: $parameters.external-servers + $parameters.internal-servers
-
$parameters.ports-1が [80, 81] で$parameters.port-2が [81, 82] の場合、$parameters.ports-1 + $parameters.ports-2はリスト [80, 81, 81, 82] として表示されます
関係式
-
== : 2 つのオペランドが等しいかどうかをテストし、等しい場合は true を返し、そうでない場合は false を返します
-
!= : 2 つのオペランドが異なるかどうかをテストし、異なる場合は true を返し、そうでない場合は false を返します
-
> : 最初のオペランドが 2 番目のオペランドより大きい場合は true を返し、そうでない場合は false を返します
-
>= : 最初のオペランドが 2 番目のオペランド以上である場合は true を返し、そうでない場合は false を返します
-
< : 最初のオペランドが 2 番目のオペランドより小さい場合は true を返し、そうでない場合は false を返します
-
<= : 最初のオペランドが 2 番目のオペランド以下である場合は true を返し、そうでない場合は false を返します
例:
- 等価演算子の使用:
$parameters.name = = "abcd" - 非等価演算子の使用:
$parameters.name != "default" - その他の関係演算子の例
- 10 > 9
- 10 >= 10
- 0 < 9
- 10 <= 9
- 10 == 10
- 10 != 1
論理式 - ブール
-
and: 論理 AND 演算子。両方のオペランドが true の場合、結果は true になり、そうでない場合は false になります
-
or: 論理 OR 演算子。いずれかのオペランドが true の場合、結果は true になり、そうでない場合は false になります
-
not: 単項演算子。オペランドが true の場合、結果は false になり、その逆も同様です
-
in: 最初の引数が 2 番目の引数の部分文字列であるかどうかをテストします
-
in: 項目がリストの一部であるかどうかをテストします
注
文字列が数値に変換され、数値が文字列に変換される式を型キャストできます。同様に、
tcp-portを数値にキャストでき、IP アドレスを文字列にキャストできます。演算子の前後に区切り文字を使用します。次の区切り文字を使用できます。
演算子の前:
space、tab、comma、(、)、[、]演算子の後:
space、tab、(、[例:
abc + def
100 % 10
10 > 9
逐語的文字列式
文字列内の特殊文字をリテラル形式にする必要がある場合は、逐語的文字列を使用できます。これらの文字列には、エスケープ文字、バックスラッシュ、引用符、括弧、空白、角括弧などを含めることができます。逐語的文字列では、特殊文字の通常の解釈はスキップされます。文字列内のすべての文字は、リテラル形式で保持されます。
StyleBook では、NetScaler ポリシー式を逐語的文字列を使用してリテラル形式で含めることができます。ポリシー式には通常、特殊文字が含まれています。逐語的文字列を使用しない場合、文字列を部分文字列に分割して特殊文字をエスケープする必要があります。
逐語的文字列を作成するには、次のように特殊文字の間に文字列をカプセル化します。
~{string}~
<!--NeedCopy-->
逐語的文字列は、StyleBook のどこでも使用できます。
注
入力文字列で文字シーケンス
}~を使用しないでください。このシーケンスは逐語的文字列の終わりを示します。
例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~
<!--NeedCopy-->
ターゲット式
StyleBook 定義では、$current-target 式を使用して現在のターゲット ADC インスタンスを参照できます。ターゲット ADC インスタンスの IP アドレスを具体的に参照するには、この式を次のように使用します。
$current-target.ip
<!--NeedCopy-->
例:
components:
-
name: lb-comp
type: ns::lbvserver
properties:
name: $current-target.ip + "-lbvserver"
<!--NeedCopy-->
この例では、lbvserver の名前はターゲット ADC インスタンスの IP アドレスで構成されています。
式の型検証
StyleBook エンジンは、コンパイル時に厳密な型チェックを可能にします。つまり、StyleBook の作成中に使用される式は、構成パックの作成時ではなく、StyleBook 自体のインポート中に検証されます。
パラメーター、置換、コンポーネント、コンポーネントのプロパティ、コンポーネントの出力、ユーザー定義変数 (repeat-item、repeat-index、置換関数の引数) などへのすべての参照は、その存在と型がすべて検証されます。
型チェックの例:
次の例では、lbvserver StyleBook のポートプロパティの予期される型は tcp-port です。NetScaler Application Delivery Management (ADM) では、型検証はコンパイル時 (インポート時) に行われます。コンパイラーは、文字列と tcp-port が互換性のある型ではないことを検出し、StyleBook コンパイラーはエラーを表示し、StyleBook のインポートまたは移行に失敗します。
components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: mylb
ipv46: 10.102.190.15
port: str("80")
servicetype: HTTP
<!--NeedCopy-->
この StyleBook を正常にコンパイルするには、コンパイラーで次を数値として宣言します。
port: 80
無効な式のフラグ付けの例:
以前のリリースでは、無効な式がプロパティ名に割り当てられた場合、コンパイラーは無効な式を検出しなかったため、StyleBook を NetScaler® ADM にインポートすることができました。現在、この StyleBook が NetScaler ADM にインポートされると、コンパイラーはそのような無効な式を識別してフラグを立てます。その結果、StyleBook は NetScaler ADM へのインポートに失敗します。
この例では、lb-sg-binding-comp コンポーネントの name プロパティに割り当てられた式は $components.lbvserver-comp.properties.lbvservername です。しかし、lbvserver-comp コンポーネントには lbvservername というプロパティはありません。以前の NetScaler ADM リリースでは、コンパイラーはこの式を許可し、正常にインポートしていました。実際の失敗は、ユーザーがこの StyleBook を使用して構成パックを作成しようとしたときに発生していました。しかし、現在では、この種のエラーはインポート中に識別され、StyleBook は NetScaler ADM にインポートされません。このようなエラーを手動で修正し、StyleBook をインポートしてください。
Components:
-
name: lbvserver-comp
type: ns::lbvserver
properties:
name: mylb
ipv46: 10.102.190.15
port: 80
servicetype: HTTP
-
name: sg-comp
type: ns::servicegroup
properties:
servicegroupname: mysg
servicetype: HTTP
-
name: lb-sg-binding-comp
type: ns::lbvserver_servicegroup_binding
condition: $parameters.create-binding
properties:
name: $components.lbvserver-comp.properties.lbvservername
servicegroupname: $components.sg-comp.properties.servicegroupname
<!--NeedCopy-->
リストのインデックス付け
リストの項目は、インデックスを直接指定することでアクセスできるようになりました。
| 式 | 説明 |
$components.test-lbs[0] |
test-lbs コンポーネントの最初の項目を参照します |
$components.test-lbs[0].properties.p1 |
test-lbs コンポーネントの最初の項目のプロパティ p1 を参照します |
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname |
lbcomps コンポーネントの最初の項目からの出力である servicegroups コンポーネントの 2 番目の項目のプロパティ servicegroupname を参照します |