Junos PyEZ設定テーブルを使用して設定データを取得する
Junos PyEZ設定テーブルとビューは、Junosデバイスの選択した設定データベースから特定の情報を抽出するためのシンプルで効率的な方法を提供します。テーブル定義を Python モジュールにロードまたはインポートした後、構成データを取得できます。
Junos PyEZ 設定 プロパティを指定する get
テーブルは、設定データのみを取得できます。プロパティを指定する set
テーブルは、Junosデバイス上のリソースを設定するだけでなく、プロパティを指定する get
テーブルと同じ方法でデータを取得できます。
特定のデバイスから情報を取得するには、Table インスタンスを作成し、ターゲット デバイスを表すオブジェクトに関連付ける Device
必要があります。例えば:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev)
次のセクションでは、データを取得および操作する方法について説明します。
構成項目の取得
構成テーブルget
またはset
プロパティは、構成から抽出するデータを識別します。例えば、以下のサンプル表定義は、[edit system login]
構成階層レベルでエレメントを抽出しますuser
。
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
Python スクリプトの構成データを取得するには、 get()
メソッドを呼び出し、必要な引数を指定します。
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get()
Table 定義にパラメーターが含まれている場合required_keys
は、メソッド引数リストに必須キーget()
ごとにキーと値のペアを含める必要があります。次のテーブル定義では、get()
メソッド引数リストに、階層レベルの要素[edit system login user]
の値name
に対応する値を持つ引数が含まれているuser
必要があります。
UserTable: get: system/login/user required_keys: user: name view: UserView
メソッドでは get()
、引数リストに必要なキーを含める必要があります。それ以外の場合、コードは ValueError 例外をスローします。次の例では、'operator' という名前のユーザーの構成データを要求します。
users = UserTable(dev).get(user='operator')
引数名がハイフンでつながれている場合は、名前のダッシュをすべてアンダースコアに変更する必要があります。ただし、引数値は文字列であるため、ハイフンを含めることができます。
method namesonly=True
引数を含めると、get()
Table 定義の or get
set
プロパティで指定された階層レベルの名前キーのみを含む構成データを返すことができます。
from jnpr.junos import Device from myTables.ConfigTables import InterfaceTable with Device(host='router.example.com') as dev: interfaces = InterfaceTable(dev) interfaces.get(namesonly=True)
例えば、 がget
階層レベルで設定データinterfaces/interface
を取得するように定義されており、Junos PyEZ スクリプトでデータを取得するときにメソッドに get()
引数を含めるnamesonly=True
とします。この場合、メソッドは、階層レベルの直接のinterfaces/interface
子である要素内の<name>
値のみを返します。要素の兄弟<name>
である要素の情報は返されず、階層内の下位レベルの要素のデータは<name>
返されません。
構成データベースを指定する
デフォルトでは、Junos PyEZ設定テーブルは候補の設定データベースからデータを取得します。Python スクリプトでメソッドを呼び出してget()
テーブル データを取得する場合、引数を渡してoptions
ディクショナリにoptions
項目を含める'database':'committed'
ことで、コミットされた構成データベースからデータを返すように指定できます。
table_options = {'inherit':'inherit', 'groups':'groups', 'database':'committed'} with Device(host='router.example.com') as dev: users = UserTable(dev) users.get(options = table_options)
継承とグループのオプションを指定する
構成データを取得するときに、メソッド引数リストの引数get()
を使用してoptions
、継承オプションとグループ オプションを制御できます。引数はoptions
ディクショナリを受け取り、デフォルトでは次の値に設定され、返された構成データに継承とグループを適用します。
options = {'inherit': 'inherit', 'groups': 'groups'}
Python スクリプトで引数を再定義 options
しない場合は、自動的にデフォルトが使用されます。
オプションはinherit
、設定グループとインターフェイス範囲で定義されたステートメントを、設定データに表示する方法を指定します。デフォルトでは、 'inherit':'inherit'
オプションが含まれており、コンフィギュレーションデータは、 、<apply-groups>
<apply-groups-except>
または 要素<interface-range>
を個別に表示<groups>
するのではなく、継承するタグ要素内のユーザー定義グループまたはインターフェイス範囲から継承されたタグ要素を囲みます。継承を適用しながら、グループでjunos-defaults
定義されたステートメントのタグ要素を含めるには、 引数で options
を使用します'inherit':'defaults'
。
継承を無効にするには、ディクショナリ値を空の文字列に設定します。
{'inherit':''}
オプションと 'groups':'groups'
オプションの両方'inherit':'inherit'
を含めると、要素が継承される設定グループも示す設定データが返されます。特定のグループから継承された要素には、次の例に示すように、開始タグに属性が含まれますjunos:group="source-group"
。
<configuration> <interfaces> <interface junos:group="re0"> <name junos:group="re0">fxp0</name> <unit junos:group="re0"> <name junos:group="re0">0</name> <family junos:group="re0"> <inet junos:group="re0"> <address junos:group="re0"> <name junos:group="re0">198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> ... </configuration>
ビュー定義の属性へのアクセスを提供するには、フィールド マッピングに適切な XPath 構文を含めることができます。次の例では、ifgroup
フィールドを定義し、インターフェイス<name>
の要素の属性にjunos:group
マップします。
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: name/@group
Junos PyEZには、group
要素の属性にアクセスするjunos:group
ためのショートカットメソッドである演算子も用意されています。次の例では、演算子を使用してgroup
要素にname
マップされるフィールドを定義しますifgroup
。スクリプト内にアクセスするifgroup
と、インターフェイス<name>
の要素に関連付けられた属性の値junos:group
を参照します。
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: { name : group }
要素がグループから継承されていない場合、その属性None
を参照するgroup
フィールドの値は です。
テーブル項目へのアクセス
構成項目を取得した後、それらを Python ディクショナリのように扱うことができるため、標準の Python ライブラリのメソッドを使用して項目にアクセスして操作できます。
構成項目名に対応するディクショナリ キーの一覧を表示するには、メソッドを呼び出します keys()
。
users = UserTable(dev).get() print (users.keys())
['user1', 'readonly']
Python 演算子を使用して in
、テーブル項目に特定のキーが存在することを確認できます。
if 'readonly' in users:
各キーに関連付けられているフィールドまたは値の一覧を表示するには、メソッドを呼び出します values()
。このメソッドは values()
、View で定義された各フィールドの名前と値のペアを持つタプルのリストを返します。
print (users.values())
[[('username', 'user1'), ('userclass', 'super-user')], [('username', 'readonly'), ('userclass', 'read-only')]]
キーと値の両方を含む項目の完全な一覧を表示するには、メソッドを呼び出します items()
。
print (users.items())
[('user1', [('username', 'user1'), ('userclass', 'super-user')]), ('readonly', [('username', 'readonly'), ('userclass', 'read-only')])]
テーブルの反復処理
テーブルは反復処理をサポートしているため、リストやディクショナリをループ処理するのと同じ方法で各構成項目をループ処理できます。これにより、必要なフィールドをすばやく書式設定して印刷することが容易になります。
次のテーブル定義は、 system/login/user
構成データから項目を抽出します。
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
次のJunos PyEZアプリケーションは、 user
アイテムをループ処理し、各ユーザーの名前とクラスを出力します。
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get() for user in users: print("Username is {}\nUser class is {}".format(user.username, user.userclass))
UserView で定義されているフィールドと username
フィールド userclass
は、それぞれ構成データ内の要素 name
と要素 class
の値に対応しています。出力には、ユーザーの名前とクラスが含まれます。
Username is user1 User class is super-user Username is readonly User class is read-only
UserView は username
要素に name
マップするフィールドを定義しますが、既定では、各 View 項目には name
、その項目を一意に識別するキーを参照するプロパティがあります。したがって、この例では、 user.name
要素の値 name
を参照することもできます。