このページで
構造化された出力を解析する Junos PyEZ 操作テーブルとビューを使用する
構造化出力の Junos PyEZ 運用(op)テーブルは、Junos デバイス上で実行される RPC の XML 出力から特定のデータを抽出します。読み込みまたは Python モジュールにテーブルの定義をインポートした後は、テーブル項目を取得し、データを抽出し、操作できます。
特定のデバイスから情報を取得するには、Table インスタンスを作成し、ターゲット デバイスを Device
表すオブジェクトに関連付ける必要があります。例えば:
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev)
以下のセクションでは、データを取得して操作する方法について説明します。
テーブル項目の取得
Table item
プロパティは、操作コマンドの出力からどの項目を抽出するかを決定します。たとえば、参照用にここに含まれる Junos PyEZ EthPortTable 定義は、デフォルトで コマンドを show interfaces "[afgxe][et]-*" media
実行し、出力から項目を physical-interface
抽出します。
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView
Python スクリプト内の Table 項目を取得するには、メソッドを get()
呼び出して、必要な引数を指定します。Table 定義にプロパティに既定の引数が args
含まれている場合は、引数リストでオーバーライドしない限り、呼び出 get()
すときに実行される RPC にこれらの引数が自動的に含まれます。
すべての Table 項目を取得するには、空の引数リストを get()
持つメソッドを呼び出します。
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()
また、コマンド オプションをメソッドの引数として渡すことで、特定の Table 項目を get()
取得することもできます。コマンド オプションが値を受け取らないフラグの場合は、引数リストで オプションを True に設定します。それ以外の場合は、引数リストにキーと値のペアとして、引数と目的の値を含めます。Junos CLI で操作コマンドの引数として使用可能な内容を確認できます。
デフォルトでは、EthPortTable は 式"[afgxe][et]-*"
に一致する名前を持つイーサネット インターフェイスの情報を返します。ge-0/3/0 インターフェイスの表項目のみを取得するには、 のget()
引数として を含めますinterface_name='ge-0/3/0'
。
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0')
Junos OS CLI(コマンドライン インターフェイス)のオプション名にハイフンが付いた場合、名前のダッシュをアンダースコアに変更する必要があります。ただし、引数値は文字列であり、ハイフンを含めることができます。
CLI コマンドが、オプション名またはキーワードを明示的に指定する必要のないオプションの最初の引数を受け取る場合、Table args_key
プロパティーがこの引数を参照している場合は、メソッド引数リストで get()
オプション名を省略できます。次の例では、コマンドは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
EthPortTable 定義 args_key
プロパティでは、オプションの引数を 、 interface_name
として定義します。これにより、メソッドの引数リストでオプション名を明示的に指定しなくてもこの引数を get()
使用できます。
eths = EthPortTable(dev) eths.get('ge-0/3/0')
デフォルトでは、Junos PyEZはすべてのop Tableキーと値を正規化し、先頭と末尾の空白をすべて取り除き、内部空白文字のシーケンスを1つのスペースに置き換えます。正規化を無効にするには、 メソッドの引数として をget()
含normalize=False
めます。
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0', normalize=False)
テーブル項目へのアクセス
Table 項目を取得した後は、Python 辞書のように扱うことができます。標準的な Python ライブラリのメソッドを使用して項目にアクセスして操作できます。
表項目名に対応する辞書キーのリストを表示するには、メソッドを keys()
呼び出します。
eths = EthPortTable(dev).get(interface_name='ge-0/3/0') print (eths.keys())
この場合、鍵は 1 つだけです。
['ge-0/3/0']
Python in
演算子を使用して、テーブル項目に特定のキーが存在することを確認できます。
if 'ge-0/3/0' in eths:
各キーに関連付けられたフィールドまたは値のリストを表示するには、メソッドを values()
呼び出します。このメソッドは values()
、View で定義された各フィールドの名前と値のペアを持つタプルのリストを返します。
print (eths.values())
[[('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)]]
キーと値の両方を含む項目の完全なリストを表示するには、メソッドを items()
呼び出します。
print (eths.items())
[('ge-0/3/0', [('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)])]
テーブルを繰り返す方法
テーブルは反復をサポートしており、リストや辞書をループするのと同じ方法で各 Table 項目をループできます。これにより、必要なフィールドをすばやくフォーマットして印刷できます。
モジュールに jnpr.junos.op
含まれる EthPortTable 定義は、 コマンドを show interfaces "[afgxe][et]-*" media
実行し、出力から項目を physical-interface
抽出します。以下のコードは、項目を physical-interface
ループして、各イーサネット ポートの名前と運用ステータスを印刷します。
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 port in eths: print ("{}: {}".format(port.name, port.oper))
EthPortView で定義されているフィールドは oper
、出力内の要素の oper-status
値に対応します。EthPortView 定義では、フィールドは name
定義されません。既定では、各 View アイテムには name
、そのアイテムを一意に識別するキーを参照するプロパティがあります。
出力には、インターフェイス名と運用ステータスが含まれます。
ge-0/3/0: up ge-0/3/1: up ge-0/3/2: up ge-0/3/3: up