このページで
構造化された出力を解析する 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