動的プロファイルのユーザー定義変数
ユーザー定義変数
動的サービス プロファイルでは、Junos OSを使用して、 [edit dynamic-profiles profile-name variables]
階層レベルでカスタム変数を設定し、それらの変数を [edit dynamic-profiles]
階層で使用できます。動的プロファイルは、加入者認証プロセス中に、これらの変数のデータを取得して外部サーバー(RADIUS など)から置換します。実行時に、変数は実際の値に置き換えられ、加入者インターフェイスの設定に使用されます。
以下のステートメントのいずれかを使用して、ユーザー定義変数を設定することができます。
default-value
—動的プロファイルのユーザー定義変数のデフォルト値を設定します。システムがこれらの変数に使用する値は、加入者の認証時に適用されます。デフォルト値を指定すると、関連するステートメントのスタンドアロン設定が提供され、外部サーバーにアクセスできない場合や、変数の値が含まれていない場合はステートメント設定のバックアップが提供されます。equals
- 実行時に評価され、変数値として返されるユーザー定義変数の式を構成します。mandatory
- 外部サーバー(RADIUS など)がユーザー定義変数の値を返す必要があることを指定します。外部サーバーが変数の値を返さない場合、動的プロファイルは失敗します。手記:変数の取得方法を定義する順序は重要です。必須変数を外部サーバーから取得し、デフォルトまたは変数式から値を導出しないようにするには、最初に必須変数を定義する必要があります。
uid
—サービス用に作成された動的プロファイルで、パラメーター化されたフィルターと CoS に一意の ID を設定します。uid-reference
—サービス用に作成された動的プロファイルで、パラメーター化されたフィルターまたは CoS の一意の ID を参照する変数を構成します。
動的プロファイルでのユーザー定義動的変数の設定
このトピックでは、ダイナミック サービス プロファイルでユーザ定義の動的変数を設定する方法について説明します。動的サービス プロファイルの他の場所で使用される変数を [edit dynamic-profiles profile-name variables]
階層レベルで定義できます。オプションで、動的プロファイルの本文に表示される任意の動的変数のデフォルト値を指定できます。デフォルトの変数値は、ルーターが外部サーバー(RADIUSなど)にアクセスできない場合、または動的変数として使用する値を取得できない場合に使用されます。または、RADIUS から返される値の使用が必須であることを指定することもできます。その値が受け取られない場合、プロファイルは失敗します。
動的変数のデフォルト値を設定する前に、以下を行います。
基本的な動的プロファイルを作成します。
基本的な動的プロファイルの設定を参照してください。
ルーターがクライアントとRADIUSサーバー間の通信を有効にするように設定されていることを確認します。
加入者アクセスの認証およびアカウンティング方法の指定を参照してください。
加入者の検証時にプロファイルで使用するすべての RADIUS 値を設定します。
加入者アクセス用のRADIUSサーバーとパラメーターを参照してください
動的サービス プロファイルで変数を設定するには、次の手順を実行します。
ユーザー定義変数での変数式の使用
Junos OSでは、式(算術演算子、文字列演算子、オペランドのグループ)を作成して、動的プロファイル内の変数として使用することができます。変数式は、 [dynamic-profiles profile-name variables]
階層レベルで設定します。実行時に、変数式が計算され、動的な加入者インターフェイスを設定するための変数値として使用されます。
動的プロファイルで式を設定する場合は、次のルールに従う必要があります。
式は、動的プロファイルの変数スタンザ内でのみ設定できます。
手記:Junos OS リリース 19.3R1以降、動的プロファイルの
predefined-variable-defaults
ステートメントで式を設定できます。 動的クライアント・プロファイルの事前定義変数のデフォルトを参照してください。ユーザー定義変数の式を含む動的プロファイルは、サービスのアクティブ化にのみ使用する必要があります。
通常、式はユーザー定義変数にのみ代入します。内部変数または定義済み変数に式を割り当てることはできません。
手記:Junos OS リリース 19.3R1 以降では、限られた数の式を設定して、定義済み変数のデフォルト値を確立できます。 動的クライアント・プロファイルの事前定義変数のデフォルトを参照してください。
式の値は、既定値よりも優先されます。
式全体は引用符(" ")で囲む必要があります。
式内の文字列は単一引用符 (' ') で囲む必要があり、単一引用符には文字列のみを含めることができます。
空白は、すべてのオペランドと演算子の区切り文字として扱われます。式内で作成したスペースを含む文字列は、1 つの文字列として扱われ、先頭または末尾に空白が含まれます。例えば:
dynamic-profiles { service profile { variables { scheduler-name; video-filter equals “ ‘ Filter 1 ’ ” # Everything within the single quotation marks is considered a string, including the leading and trailing white space } } }
式は、すべて算術演算子またはすべて文字列演算子のいずれかである必要があります。算術演算子と文字列演算子の混在は、正しい型に正しく変換されない限り許可されません。
式は、他のシステム定義変数または他のユーザー定義変数を参照できます。ただし、変数間の循環参照は許可されません。たとえば、次の参照は正しくありません。
dynamic-profiles { Service_Profile_1 { variables { scheduler-name; transmit-rate2 equals “ ( $transmit-rate1 * 2)/3” # refers to transmit-rate1 transmit-rate1 equals “ ( $transmit-rate2 * 2)/3” # refers to transmit-rate2 } } }
「default」値または「equals」式を含まない必須変数には、サービスアクティベーションの一部として値を含める必要があります。例えば、動的サービスプロファイル定義「service-video」に2つ以下の必須変数を含む「service-video(value1, value2)」のようなRADIUSサービスVSAは成功します。少なくとも 1 つの必須変数に値が関連付けられていない場合、サービスのアクティブ化は失敗します ("default" または "equals" 属性の評価)。
表 1 は、式の作成に使用できる、サポートされている演算子と関数の一覧です。
優先順位 5 が最高レベルです。
操作 |
演算子 |
結合 |
順位 |
アクション |
---|---|---|---|---|
算術加算 |
+ |
左 |
1 |
演算子の右と左の要素を一緒に追加します。 |
算術減算 |
- |
左 |
1 |
演算子の左側の要素から演算子の右側の要素を減算します。 |
算術乗算 |
* |
左 |
2 |
演算子の左側の要素に演算子の右側の要素を乗算します。 |
算術部門 |
/ |
左 |
2 |
演算子の左側の要素を演算子の右側の要素で除算します。 |
算術モジュロ |
% |
左 |
2 |
演算子の左側の要素を演算子の右側の要素で除算し、整数剰余を返します。演算子の左側の要素が演算子の右側の要素より小さい場合、結果は演算子の左側の要素になります。 |
連結 |
## |
左 |
3 |
演算子の左側の文字列値と演算子の右側の値を結合して、新しい文字列を作成します。 |
最大 |
max(パラメータ 1,パラメータ 2) |
左 |
4 |
パラメーターとして渡された 2 つの値の最大値を取ります。 |
最低限 |
min(param1,param2) |
左 |
4 |
パラメーターとして渡された 2 つの値の最小値を取ります。 |
丸い |
round(param1) |
- |
4 |
値を最も近い整数に丸めます。 |
切り捨てる |
trunc(param1) |
- |
4 |
整数以外の値を小数点の左側の値に切り捨てます。 |
文字列に変換 |
toStr(パラメータ1) |
- |
4 |
括弧内の変数を null で終わる文字列に変換します。 |
整数に変換 |
toInt(パラメータ1) |
- |
4 |
パラメータを整数に変換します。パラメーターとして使用できる文字列または変数は 1 つです。 |
ランダム |
rand() |
- |
4 |
ランダムな数値を生成します。 |
ゼロとまではいかなくても |
ifNotZero(パラメータ1, パラメータ2) |
左 |
4 |
最初のパラメータが 0 でない場合は、2 番目のパラメータを返します。最初のパラメーターが 0 の場合は NULL を返します。 |
かっこ |
( ) |
- |
5 |
オペランドと演算子をグループ化して、単純な優先順位とは異なる結果を達成します。の優先順位が最も高いのが効果的です。 |
式は、変数に値が入力された後に評価されます。評価は、プロファイルのインスタンス化の直前に実施され、値のチェックが含まれます。計算された値が受け入れられない場合、または式の構文を管理するルールが壊れている場合、式の評価は失敗し、プロファイルのインスタンス化は行われず、エラーを説明するメッセージがログに記録されます。
表 2 は、考えられる式エラーのシナリオと、ルーター ソフトウェアによって実行されるアクションを示しています。
エラー |
発生 |
アクション |
変数値 |
---|---|---|---|
解析エラー |
コミットチェックフェーズ |
コミット失敗 |
適用外 |
循環変数依存関係エラー |
コミットチェックフェーズ |
コミット失敗 |
適用外 |
式内の変数は定義されていません |
コミットチェックフェーズ |
コミット失敗 |
適用外 |
ゼロで割る |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
ゼロ (0) |
数値に文字列を追加する |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
ゼロ (0) |
オーバーフローエラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
未定義 |
アンダーフローエラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
未定義 |
また、ユーザー定義変数をデフォルト値で設定することもできます。デフォルト値は、RADIUSサーバーにアクセスできない場合、またはVSA属性に値が含まれていない場合、関連するステートメントのスタンドアロン設定またはステートメント設定のバックアップを提供します。
動的プロファイルでの変数式の設定
式 (算術演算子、ストリング演算子、およびオペランドのグループ) を作成して、動的プロファイル内で変数として使用することができます。これらの式は、動的な加入者インターフェイスを設定するための変数値として使用されます。
動的プロファイル変数式を設定するには:
表 3 に、サポートされている演算子と関数を使用して作成できる式の例をいくつか示します。
例 |
形容 |
---|---|
video-filter が "' Filter1' と等しい |
文字列「Filter1」を動的$videoフィルター変数に代入します。 |
video-filter2 は "$video-filter ## ' Filter2' " と等しくなります。 |
動的変数 "$video-filter" を文字列に変換し、新しい文字列を文字列 "Filter2" と連結します。結果は、$video-filter2 変数に割り当てられた文字列 "$video-filter Filter2" です。 |
tempvar が "120" に等しい |
「120」を整数に変換し、その整数を$tempvar変数に代入します。 |
送信レート2は「($transmit-rate1 * 2)/3 + $tempvar)」と等しくなります。 |
「transmit-rate1」変数に 2 を掛け、その値を 3 と「$tempvar」の値の合計で除算します。結果は変数 $transmit-rate2 に代入されます。 |
host-ip が " '203.0.113.2' と等しい |
文字列「203.0.113.2」を$host-ip変数に代入します。 |
max-val "最大($max 1,$max 2)" |
値 "max1" または "max2" の大きい方を $max-val 変数に代入します。 |
min-val "$min($var 1,30)" |
値「var1」と「30」の小さい方を$min-val変数に代入します。 |
rounded-var は "round($var 1 )" と等しくなります。 |
変数 "$var 1" の値を最も近い整数に四捨五入し、その値を $rounded-var 変数に代入します。 |
trunc-var は "trunc(1234.5)" と等しくなります。 |
小数点以下の左側に括弧で囲まれた値を切り捨て、結果の値を $trunc-var 変数に代入します。 |
bwg-shaping-rate は「$ancp-downstream - ($ancp-downstream % 2 * (1 - $sp-qos-cell-mode))」と等しくなります。 |
かっこで囲まれた優先順位に従って式を評価します。 |
temp-filter1 が " 'Filter1' ## toStr($filter)" と等しい |
"$filter" 変数を文字列値に変換し、変換された文字列を文字列 "Filter1" に連結します。結果の結合された文字列は、$temp-filter1 変数に割り当てられます。 |
動的プロファイルの条件付き設定の概要
動的プロファイルに条件付き設定ステートメントを設定して、クライアントまたはサービスの加入者情報を動的に取得することができます。
条件付き構成には、主に 2 つの手順が含まれます。
条件変数の定義
設定ステートメントでの条件変数の参照
条件変数は、式 ifNotZero (param1, param2)として定義されます。この式では、 param1 は、値が RADIUS などの外部サーバーから導出されるユーザー定義変数で、 param2 はユーザー定義変数、関数、演算、数値、または文字列です。条件変数は、ユーザー定義変数または一意の ID (UID) reference 変数にすることができます。事前定義変数または UID 変数にすることはできません。Junos OS では、条件変数はサービス動的プロファイルでのみサポートされています。
条件変数が参照される設定ステートメントは、 conditional 設定ステートメントと呼ばれます。条件変数を定義すると、 dynamic-profiles 設定ステートメントで参照され、サービス プロファイルがインスタンス化されるときに処理されます。以下のサービス プロファイル設定ステートメントは、条件変数をサポートしています。
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter input filter-name
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter output filter-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then policer policer-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then hierarchical-policer policer-name
dynamic-profiles profile-name class-of-service scheduler-maps map-name forwarding-class class-name scheduler scheduler-name
システムは、サービス プロファイルのインスタンス化時に条件変数と条件付き設定ステートメントを評価する際に、次の一連のルールに従います。
関数
ifNotZero
(param1, param2) では、 param1 の値を外部サーバーから受け取らず、デフォルト値が設定されていない場合、変数の値はゼロ以外として扱われ、 param2 が評価されます。関数
ifNotZero
(param1, param2) の param1 の値が 0 の場合、式の値として NULL が返され、param2は評価されません。この場合、条件変数の値はNULLとなり、条件変数が参照される設定ステートメントは無視されます。param1 の値が 0 以外の場合、param2が評価され、その値が式の値として返されます。
次の filter-service および cos-service 設定例は、ルールがどのように適用されるかを示しています。
フィルタ サービスの設定例
filter-service { variables { input-filter-var mandatory; output-filter-var mandatory; bw-limit-var mandatory; term1-var default-value term1; input-filter-ref { equals "ifNotZero($input-filter-var,$input-filter-var)"; uid-reference; } output-filter-ref { equals "ifNotZero($output-filter-var,$output-filter-var)"; uid-reference; } policer1-ref { equals "ifNotZero($bw-limit-var,'policer1')"; uid-reference; } term1 equals "ifNotZero($term1-var,$term1-var)"; input-filter uid; output-filter uid; policer1 uid; } interfaces { pp0 { unit "$junos-interface-unit" { family inet { filter { input "$input-filter-ref" precedence 50; output "$output-filter-ref" precedence 50; } } } } } firewall { family inet { filter "$input-filter" { interface-specific; term $term1 { then { policer "$policer1-ref"; service-accounting; } } term rest { then accept; } } filter "$output-filter" { interface-specific; term rest { then accept; } } } policer "$policer1" { if-exceeding { bandwidth-limit "$bw-limit-var"; burst-size-limit 15k; } then discard; } } }
filter-service 設定の例では、input-filter-ref
、output-filter-ref
、policer1-ref
、およびterm1
は条件付き変数で、input "$input-filter-ref" precedence 50
、output "$output-filter-ref" precedence 50
、term $term1
、およびpolicer "$policer1-ref"
は条件付き設定ステートメントです。この例では、input-filter-var
の値が 0 の場合、条件変数 input-filter-ref
の値は NULL になります。したがって、条件変数が参照されているコンフィギュレーション・ステートメント input “$input-filter-ref” precedence 50
全体が無視されます。ただし、変数の値が 0 以外の場合、設定ステートメントはサービス プロファイルのインスタンス化中に処理されます。
CoS サービスの設定例
cos-service { variables { sch1_var mandatory; sch2_var mandatory; sch1_ref { equals "ifNotZero($sch1_var,$sch1_var)"; uid-reference; } sch2_ref { equals "ifNotZero($sch2_var,$sch2_var)"; uid-reference; } smap1 uid; sch1 uid; sch2 uid; } class-of-service { scheduler-maps { "$smap1" { forwarding-class best-effort scheduler "$sch1_ref"; forwarding-class assured-forwarding scheduler "$sch2_ref"; } } schedulers { "$sch1" { transmit-rate percent 30; buffer-size percent 30; priority low; } "$sch2" { transmit-rate percent 10; buffer-size percent 10; priority high; } } } }
cos-service 設定の例では、sch1_ref
とsch2_ref
は条件変数で、forwarding-class best-effort scheduler "$sch1_ref"
とforwarding-class assured-forwarding scheduler "$sch2_ref"
は条件付き設定ステートメントです。filter-serviceの設定例での評価と同様に、条件変数で参照される変数の値が0の場合、その条件変数が参照される設定ステートメントは無視され、CoSサービスプロファイルのインスタンス化中に処理されません。