構造化出力を解析するためのJunos PyEZ操作テーブルの定義
概要 RPC XML出力から特定の項目を選択するカスタムテーブルを作成し、Junosデバイスから運用情報を抽出します。
Junos PyEZオペレーショナル(op) 構造化出力のテーブルは、Junosデバイスで実行されたRPCのXML出力からデータを抽出します。これにより、デバイスに関連する動作状態情報をすばやく取得して確認できます。
Junos PyEZ テーブルは YAML を使用してフォーマットされます。Op テーブル定義には、 表 1 に要約されている必須パラメーターとオプション・パラメーターをいくつか含めることができます。
テーブル パラメーター名 |
テーブル パラメーター |
説明 |
|---|---|---|
テーブル名 |
– |
テーブルのユーザー定義識別子。 |
RPC コマンド |
|
実行する RPC の要求タグ名。 |
RPC の既定の引数 |
|
(オプション)RPC の既定のコマンド オプションと引数。 |
RPC オプションの引数キー |
|
(オプション)コマンドの省略可能な最初の引数が特定のキーワードを必要としない場合のその引数への参照。 このプロパティーを含めない場合は、操作データを取得するときにメソッド引数リストに含まれる |
テーブル項目 |
|
データから抽出する項目を選択する要素内の これらの項目は、関連付けられたビューの参照になります。 |
テーブル項目キー |
|
(オプション)要素を識別子として使用 項目が識別子に要素を使用する場合は |
テーブルビュー |
|
テーブル項目からフィールド データを抽出するために使用されるビュー。 |
Junos PyEZディストリビューションに含まれている次のJunos PyEZ運用表 EthPortTableを考えてみましょう。テーブルは、ターゲットデバイス上のイーサネットインターフェイスの動作状態情報を抽出します。
---
EthPortTable:
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
args_key: interface_name
item: physical-interface
view: EthPortView
以下のセクションでは、Table のさまざまなコンポーネントについて説明します。
テーブル名
テーブル名は、テーブルのユーザー定義識別子です。YAML ファイルまたは文字列には、1 つ以上のテーブルを含めることができます。YAML ドキュメントの先頭は左揃えにする必要があります。例えば:
--- EthPortTable: # Table definition
RPC コマンド (rpc)
Junos PyEZ op 構造化出力のテーブルは、RPC の XML 出力から特定の情報を抽出します。デバイスで実行する RPC を指定するには、op テーブル定義にプロパティを含める rpc 必要があります。
rpc値は、コマンドの Junos XML リクエストタグです。例えば、 コマンドget-interface-informationのshow interfacesリクエスト・タグ名は です。
rpc: get-interface-information
要求タグは、次のいずれかの方法を使用して見つけることができます。
| display xml rpcJunos OS CLI で コマンドの後に オプションを追加するJunos PyEZ
Deviceインスタンスdisplay_xml_rpc('command', format='text')メソッドの実行Junos XML API Explorer でのコマンドと対応するタグの検索
RPC の既定の引数 (引数)
省略可能 args なプロパティは、RPC の既定のコマンド オプションと引数を定義します。これらは、 の下に argsインデントされたキーと値のペアとしてリストされます。既定の引数は、スクリプトでメソッドを呼び出し get() 、その既定値をオーバーライドする引数を指定しない場合に使用されます。
オプションが特定の値を必要としない単なるフラグである場合は、オプション値をテーブル定義でに設定Trueすることで、引数リストに含めることができます。たとえば、show interfaces mediaコマンドは引数 media: True. を持つ要求タグにget-interface-informationマップします。オプションに値が必要な場合は、引数の値を既定値として使用する値に設定します。
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
Junos OS コマンドライン インターフェイス(CLI)のオプション名がハイフンでつながれている場合は、名前のダッシュをすべてアンダースコアに変更する必要があります。
デフォルトでは、Junos PyEZはテーブルのすべてのキーと値を正規化し、先頭と末尾の空白をすべて削除し、内部空白文字のシーケンスを単一のスペースに置き換えます。Table の正規化を無効にするには、引数リストに含めます normalize: False 。
args:
normalize: False
RPC 省略可能な引数キー (args_key)
オプション args_key ・プロパティーは、CLI コマンドがオプション名またはキーワードを明示的に指定する必要のないオプションの最初の引数を取る場合に使用します。次の例では、 show interfaces コマンド はオプションの引数としてインターフェイス名を取ります。
user@router> show interfaces ? Possible completions: <[Enter]> Execute this command <interface-name> Name of physical or logical interface ge-0/0/0 ge-0/0/0.0
このプロパティーを使用すると args_key 、オペレーショナル・データを取得するときに、キーワードまたはオプション名を明示的に指定しなくても、このオプションの引数を使用できます。
args_key: interface_name
Table 定義にプロパティを含める args_key 場合は、引数値を指定できますが、データを取得するときにオプション名を省略できます。
eths = EthPortTable(dev).get('ge-0/3/0')
Table 定義でプロパティを args_key 省略した場合、データを取得するときにこのパラメーターを含める場合は、オプション名を明示的に指定する必要があります。
eths = EthPortTable(dev).get(interface_name='ge-0/3/0')
テーブルアイテム(アイテム)
すべての op テーブル定義で必要な Table item プロパティは、RPC 出力から抽出するデータを識別します。 item 値は、目的の要素を選択するタグ内の <rpc-reply> 最上位要素に対する相対的な XPath 式です。これらの項目は、関連付けられたビューの参照になります。
以下の例は、切り捨てられた CLI コマンドの出力例を示しています。
user@router> show interfaces media "[afgxe][et]-*" | display xml
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/15.1R1/junos">
<interface-information xmlns="http://xml.juniper.net/junos/15.1R1/junos-interface" junos:style="normal">
<physical-interface>
<name>ge-0/0/0</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>up</oper-status>
...
</physical-interface>
<physical-interface>
<name>ge-0/0/1</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>up</oper-status>
...
</physical-interface>
</interface-information>
</rpc-reply>
この出力から要素を選択する <physical-interface> には、プロパティを含め item 、要素を選択する XPath を指定します。この場合、 <physical-interface> 要素は最上位 <interface-information> 要素の直接の子であり、値の XPath 式 item は単なる要素名です。
item: physical-interface
これらの項目は、関連付けられたビューの参照になります。
異なるデバイスは、同じRPCに対して異なる出力要素を出力できます。その結果、アイテムの XPath はシステムによって異なる場合があります。このプロパティでは item 、パイプ (|) 演算子を使用して暗黙的な "or" を指定し、複数の可能なノードから選択することができます。プロパティに item この演算子が含まれている場合、プロパティは key リストを使用する必要があります。例えば:
UTMStatusTable:
rpc: show-utmd-status
item: //multi-routing-engine-item/utmd-status | //utmd-status
view: UTMStatusView
key:
- re-name | Null
テーブル項目キー (キー)
省略可能 key なプロパティは、要素を識別子として使用 <name> しない項目、または複合キーを使用する場合に、Table 項目を一意に識別するために使用するタグを選択する XPath 式または XPath 式のリストです。
次のコマンド出力では、各 <physical-interface> 要素は子 <name> 要素によって一意に識別されます。
user@router> show interfaces media "[afgxe][et]-*" | display xml
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/0/0</name>
...
</physical-interface>
<physical-interface>
<name>ge-0/0/1</name>
...
</physical-interface>
</interface-information>
</rpc-reply>
Table item プロパティで<physical-interface>要素が選択されている場合、既定で要素をキーとして使用する場合は<name>、Table 定義からプロパティを省略keyできます。
これに対して、次のコマンド show route brief 出力について考えてみます。
<rpc-reply>
<route-information>
<route-table>
...
<rt junos:style="brief">
<rt-destination>10.0.0.0/24</rt-destination>
<rt-entry>
<active-tag>*</active-tag>
<current-active/>
<last-active/>
<protocol-name>Static</protocol-name>
<preference>5</preference>
<age junos:seconds="9450374">15w4d 09:06:14</age>
...
</rt-entry>
</rt>
<rt junos:style="brief">
<rt-destination>10.0.10.0/24</rt-destination>
<rt-entry>
<active-tag>*</active-tag>
<current-active/>
<last-active/>
<protocol-name>Direct</protocol-name>
<preference>0</preference>
<age junos:seconds="9450380">15w4d 09:06:20</age>
...
</rt-entry>
</rt>
</route-table>
</route-information>
</rpc-reply>
要素を選択するroute-table/rt場合、各ルートエントリを一意に識別するための対応する<name>要素はありません。<name>識別子が存在しない場合、プロパティはkey、各項目を一意に識別するタグを指定できます。この場合、キーとして使用することで<rt-destination>各項目を一意に識別route-table/rtできます。
item: route-table/rt key: rt-destination
さらに、Junos PyEZ リリース 2.3.0 以降、キーが不要であることを示す テーブル を 定義 key: Null できるようになりました。この場合、Table と View は、キーを持つ入れ子になったディクショナリではなく、単純なディクショナリとしてデータを返します。
テーブル項目は、単一の要素または複数の要素で構成されるキーによって定義できます。単一要素キーは、プロパティの値 key に単純な XPath 式を使用します。複合キーは、XPath 式のリストによって定義されます。次のテーブル定義について考えてみます。
PicHwTable:
rpc: get-chassis-inventory
item: .//name[starts-with(.,'PIC')]/parent::*
key:
- ancestor::*[starts-with(name,'FPC')]/name
- ancestor::*[starts-with(name,'MIC')]/name
- name
view: PicHwView
このテーブル定義の複合キーは、次のようになります。
('FPC 2', 'MIC 0', 'PIC 0')
複合キーが欠落している要素を参照している場合、Junos PyEZ はキー Noneの値を に置き換えます。
('FPC 0', None, 'PIC 0')
プロパティに key パイプ (|) 演算子が含まれている場合は、プロパティでリスト item を使用する必要があります。
このプロパティはkey、テーブルが複数の可能なノードから選択できるようにするパイプ ( | ) 演算子もサポートしています。この演算子を使用すると、異なるシステムが同じ RPC に対して異なる出力要素を出力する場合でも、同じテーブルを使用できます。たとえば、参照用にここに示されている LLDPNeighborTable は、キーとして または lldp-local-port-id 要素を選択できますlldp-local-interface。
---
LLDPNeighborTable:
rpc: get-lldp-neighbors-information
item: lldp-neighbor-information
key: lldp-local-interface | lldp-local-port-id
view: LLDPNeighborView
LLDPNeighborView:
fields:
local_int: lldp-local-interface | lldp-local-port-id
local_parent: lldp-local-parent-interface-name
remote_type: lldp-remote-chassis-id-subtype
remote_chassis_id: lldp-remote-chassis-id
remote_port_desc: lldp-remote-port-description
remote_sysname: lldp-remote-system-name
プロパティで key 演算子を使用すると | 、RPC 応答に存在する各キーがキーの一覧に追加されます。この演算子を使用して暗黙的な「または」を指定でき、異なるタイプの設定またはリリースに対して異なるタグ名が存在する場合に役立ちます。たとえば、RPC が 1 つのデバイスの識別子として返 lldp-local-interface され、同じ RPC が別のデバイスの識別子として返される lldp-local-port-id 場合、テーブルは適切なキーを自動的に選択します。
テーブル ビュー (表示)
このプロパティは view 、テーブル定義を特定のビューに関連付けます。ビューは、XPath 式を使用して、ユーザー定義フィールド名を選択したテーブル項目の要素にマップします。ビューをカスタマイズして、テーブル項目から必要な要素のみを選択できます。