構造化された出力を解析する Junos PyEZ 操作テーブルのビューを定義する
構造化出力の Junos PyEZ 運用(op)テーブルは、Junos デバイス上で実行される RPC の XML 出力から特定のデータを選択します。テーブルは、テーブルアイテム内のフィールドにアクセスし、ユーザー定義のPython変数にマップするために使用されるビューに関連付けられています。テーブルを特定のビューに関連付けるには、テーブル定義にプロパティを view
含めて、引数としてビュー名を取得します。
ビューは、選択したテーブル項目内の XML 要素にユーザー定義の変数をマップします。ビューを使用すると、Python で操作できるプロパティを持つ変数として、出力内の特定のフィールドにアクセスできます。Junos PyEZは、データの抽出、あらゆるタイプの変換やデータ正規化を処理します。ビューで定義されたキーは、有効な Python 変数名である必要があります。
Junos PyEZ ビューは、テーブルと同様に、YAML を使用してフォーマットされます。構造化された出力を解析するビューには、 表 1 に要約された多数のパラメーターを含めることができます。
パラメータ名を表示 |
[パラメータを表示] |
説明 |
---|---|---|
名前を表示 |
– |
ビューのユーザー定義識別子。 |
フィールド項目 |
|
ユーザー定義のフィールド名をテーブル項目内の要素を選択する XPath 式にマップするキーと値のペアの連想配列(辞書)。フィールド名は有効な Python 変数名である必要があります。 |
フィールド グループ |
|
ユーザー定義のフィールド名をテーブル項目内の要素を選択する XPath 式にマップするキーと値のペアの連想配列(辞書)。XPath 式は、対応するグループ パラメーターによって設定されたコンテキストに対して相対的です。フィールド名は有効な Python 変数名である必要があります。 |
グループ |
|
ユーザー定義のグループ名を XPath 式にマッピングするキー値ペアの連想配列(または辞書)が、そのグループ内のフィールドに XPath コンテキストを設定します。 |
Junos PyEZ ディストリビューションに含まれている以下の Junos PyEZ op Table and View を検討してください。表は、ターゲット デバイス上のイーサネット インターフェイスの運用状態情報を抽出します。
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView EthPortView: groups: mac_stats: ethernet-mac-statistics flags: if-device-flags fields: oper: oper-status admin: admin-status description: description mtu: { mtu : int } link_mode: link-mode macaddr: current-physical-address fields_mac_stats: rx_bytes: input-bytes rx_packets: input-packets tx_bytes: output-bytes tx_packets: output-packets fields_flags: running: { ifdf-running: flag } present: { ifdf-present: flag }
以下のセクションでは、ビューの各コンポーネントについて説明します。
名前を表示
ビュー名は、ビューのユーザー定義の識別子です。テーブルを特定の View に関連付けるには、テーブル定義にプロパティを view
含め、引数としてビュー名を指定します。例えば:
--- EthPortTable: # Table definition view: EthPortView EthPortView: # View definition
フィールド(フィールド)
選択したテーブル項目から必要な要素のみを参照するように、ビューをカスタマイズします。これを fields
行うには、プロパティと、ユーザー定義のフィールド名のマッピングを含む連想配列を含め、 Table 項目から目的の要素を選択する XPath 式を使用します。フィールド名は有効な Python 変数名である必要があります。XPath 式は、Table アイテムのコンテキストに対して相対的です。
次のサンプル RPC 出力を検討してください。
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> <admin-status junos:format="Enabled">up</admin-status> <oper-status>down</oper-status> <local-index>135</local-index> <snmp-index>530</snmp-index> <link-level-type>Ethernet</link-level-type> <mtu>1514</mtu> ... </physical-interface> </interface-information> </rpc-reply>
Table item
パラメーターが出力から要素を選択 <physical-interface>
した場合、ビュー定義内の各フィールドの XPath 式は、そのコンテキストに対して相対的です。次のビュー定義は、各ユーザー定義フィールド名を要素の子要素に <physical-interface>
マッピングします。
EthPortView: fields: oper: oper-status admin: admin-status mtu: { mtu : int }
Python スクリプトでは、変数プロパティとして View アイテムにアクセスできます。既定では、各 View アイテムには name
、そのアイテムを一意に識別するキーを参照するプロパティがあります。
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev) eths.get() for item in eths: print (item.name) print (item.oper) print (item.admin) print (item.mtu)
フィールドの形式によって、フィールドの値の型が決まります。デフォルトでは、フィールド値は文字列として格納されます。フィールドマッピングでフィールド値に異なるタイプを指定できます。次の例では、要素の値を mtu
整数として定義しています。
EthPortView: fields: mtu: { mtu : int }
RPC出力では、一部のJunos XML要素は、フラグとして機能する空の要素です。フィールドがフィールドマッピングのフラグであることを明示的に示すことができます。フィールド項目の値、 フラグは True 要素が出力に存在する場合とFalse要素がない場合。次の例では、要素を ifdf-running
フラグとして定義します。
EthPortView: fields: mtu: { mtu : int } running: { if-device-flags/ifdf-running : flag }
また、以下の構文を使用して、フィールド項目値をブール値に設定することもできます。
fieldname: { element-name: (True | False)=regex(expression) }
要素の値は、 に渡された正規表現に対して regex()
評価されます。要素の値が式に一致する場合、フィールド項目の値は形式で定義されたブール値に設定されます。以下の例では、要素の oper_status_down
値 oper-status
に 'down' が含まれている場合、フィールドは True に設定されます。
oper_status_down: { oper-status: True=regex(down) }
また、より複雑な正規表現を使用し、複数の値にマッチさせることもできます。要素内 rt-destination
のアドレスが'198.51.'で始まる場合、次のフィールド項目が True に設定されます。
dc1_route: { rt-destination: True=regex(^198\.51\.) }
要素に正規表現でいずれかの値が含まれている場合、 no-refresh
次のフィールド項目が True に設定されます。
no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
グループ(グループ)とフィールドグループ(fields_)
グループを選択し、テーブル項目内の特定のノード セット内の要素を参照するショートカット メソッドを提供します。
以下の RPC 出力では、 <if-device-flags>
エレメントには CLI 出力の フィールドに表示される Device flags
値に対応する複数の子エレメントが含まれています。
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> ... <if-device-flags> <ifdf-present/> <ifdf-running/> </if-device-flags> ... </physical-interface> </interface-information> </rpc-reply>
ビュー定義内で、プロパティを fields
使用して子要素にアクセスするには、選択したテーブル 項目に対する各要素に完全な XPath 式を提供します。たとえば、EthPortTable 定義で項目が選択 <physical-interface>
された場合、フィールド アイテム マッピングは次の XPath 式を使用します。
EthPortView: fields: present: if-device-flags/ifdf-present running: if-device-flags/ifdf-running
または、要素にコンテキストを設定するグループを作成し、そのコンテキストに対して <if-device-flags>
XPath 式を提供するフィールド グループ項目を定義することもできます。ビュー定義内で任意の数のグループを定義できます。
グループを作成するには、プロパティを groups
含め、ユーザー定義のグループ名を、新しいコンテキストを定義する XPath 式にマッピングします。次に、名前の後にグループ名が fields_
続くフィールドグループを定義します。フィールド グループは、ユーザー定義のフィールド名を XPath 式にマッピングするを含む連想配列で、XPath 式内 groups
のコンテキスト セットを基準にしています。フィールド名は有効な Python 変数名である必要があります。
以下の例では、グループflags
と対応するフィールドグループfields_flags
を定義しています。グループはflags
、 階層レベルにコンテキストをphysical-interface/if-device-flags
設定しpresent
、 フィールドはそれぞれ と running
ifdf-running
要素の値にifdf-present
アクセスします。
EthPortView: groups: flags: if-device-flags fields_flags: present: ifdf-present running: ifdf-running
フィールドまたはフィールド グループを使用する場合でも、Junos PyEZ スクリプト内でユーザー定義のフィールド名を使用して、同じ方法で値にアクセスできます。