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 を参照することもできます。