式
StyleBookの最も強力な機能の1つは、式の使用です。StyleBookの式は、さまざまなシナリオで動的な値を計算するために使用できます。次の例は、パラメーター値をリテラル文字列と連結する式です。
例:
$parameters.appname + "-mon"
この式は、
appnameという名前のパラメーターを取得し、それを文字列-monと連結します。
次の種類の式がサポートされています。
算術式
-
加算 (+)
-
減算 (-)
-
乗算 (*)
-
除算 (/)
-
剰余 (%)
例:
-
2つの数値の加算: $parameters.a + $parameters.b
-
2つの数値の乗算: $parameters.a * 10
-
ある数値を別の数値で除算した後の剰余の検索:
15%10 の結果は 5 です。
文字列式
-
2つの文字列を連結する (+)
例:
2つの文字列を連結する:str("app-") + $parameters.appname
リスト式
2つのリストを結合する (+)
例:
関係式
-
==: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: 論理積演算子です。両方のオペランドがtrueの場合、結果はtrueになり、それ以外の場合はfalseになります。
-
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}~
逐語文字列はStyleBookのどこでも使用できます。
注
入力文字列で文字シーケンス
}~を使用しないでください。このシーケンスは逐語文字列の終わりを示すためです。
例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~
ターゲット式
StyleBookの定義では、現在のターゲットADCインスタンスを参照するために
$current-target式を使用できます。ターゲットADCインスタンスのIPアドレスを具体的に参照するには、この式を次のように使用します。
$current-target.ip
例:
components:
-
name: lb-comp
type: ns::lbvserver
properties:
name: $current-target.ip + "-lbvserver"
この例では、
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
このStyleBookを正常にコンパイルするには、コンパイラで以下を数値として宣言します。
port: 80
無効な式のフラグ付けの例:
以前のリリースでは、プロパティ名に無効な式が割り当てられても、コンパイラは無効な式を検出せず、StyleBookがNetScaler® ADMにインポートされることを許可していました。現在、このStyleBookがNetScaler ADMにインポートされると、コンパイラはそのような無効な式を識別してフラグを付けます。その結果、StyleBookはNetScaler ADMへのインポートに失敗します。
この例では、
lb-sg-binding-compコンポーネントの名前プロパティに割り当てられた式は$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
リストのインデックス付け
リストの項目は、直接インデックス付けすることでアクセスできるようになりました。
| 式 | 説明 |
$components.test-lbs[0] |
test-lbsコンポーネント内の最初の項目を参照します |
$components.test-lbs[0].properties.p1 |
test-lbsコンポーネント内の最初の項目のプロパティp1を参照します |
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname |
servicegroupsコンポーネント内の2番目の項目のプロパティservicegroupnameを参照します。これは、lbcompsコンポーネントの最初の項目からの出力です |