Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

Junos PyEZ設定テーブルを使用して、Junosデバイス上の構造化リソースを設定する

Junos PyEZ 設定 set プロパティを指定するテーブルでは、Junos デバイスをプログラムで設定するために使用できる構造化リソースを定義できます。構造化リソースのテーブル定義をJunos PyEZアプリケーションにロードまたはインポートした後、アプリケーションはデバイス上でリソースを設定できます。このトピックでは、Junos PyEZ設定テーブルとビューを使用してデバイス上の構造化リソースを設定するための一般的なプロセスといくつかの特定のタスクについて説明します。

一般的な設定プロセス

構成テーブル set プロパティは、リソースが構成される構成階層レベルを識別し、ビュー内のフィールドの XPath コンテキストを設定します。例えば、次の表は、[edit system login]階層レベルでuserリソースを定義しています。

ビューに含まれるフィールドは、ユーザーがそのリソースに対して設定できるリーフステートメントを定義します。フィールドでは、デフォルト値だけでなく、タイプや制約チェックも定義できます。

デバイス上で構造化リソースを設定するには、テーブルをアプリケーションにロードまたはインポートする必要があります。次に、テーブルオブジェクトを作成し、ターゲットデバイスの Device オブジェクトに関連付けます。例えば:

リソースの設定ステートメントの値を定義するには、対応するフィールド名(ビューで定義)を目的の値と等しく設定します。

ビューがフィールドのデフォルトを明示的に定義しない限り、フィールドのデフォルト値は None です。ビューでフィールドの型または制約チェックが定義されている場合、アプリケーションはそのフィールドの正しいデータ型と値を指定し、チェックが失敗した場合に発生する可能性のあるエラーを理想的に処理する必要があります。テーブルの key-field プロパティ (この例では username) で宣言されているキー フィールドには、常に値を定義する必要があります。

次のコードは、usernameuserclass、およびpasswordフィールドのUserConfigTableをインポートして値を設定します。ビューのpasswordフィールドは、設定内のencrypted-passwordステートメントを参照するため、データは事前に暗号化されたパスワードを提供する必要があります。

固定形式のキーワードや複数の値を持つステートメントの設定、ステートメントやリソースの複数のインスタンスの設定、リーフやコンテナのステートメントの削除、Junos XML属性に対応するオブジェクトプロパティの設定など、より具体的な設定タスクの詳細については、以下のセクションを参照してください。

オブジェクトを設定した後、 append() メソッドを呼び出して対応するJunos XML設定を構築し、そのTableオブジェクトの設定変更の完全なセットを格納する lxml オブジェクトに追加する必要があります。設定変更には、ビューで定義されたデフォルト値またはユーザー設定値のいずれかを持つフィールドのみが含まれます。 None の初期値を保持するフィールドは無視されます。

XML をビルドした後、 append() メソッドはすべてのフィールドを既定値にリセットするか、ビューでそのフィールドの既定値が定義されていない場合は None にリセットします。これにより、同じアプリケーション内で複数のオブジェクトを設定でき、後続のリソースを設定する際に、1つのリソースに定義された値を意図せず使用することがなくなります。新しいリソースを設定するたびに、 append() を呼び出して、最終的な変更セットに設定変更を追加する必要があります。 append() メソッドの詳細については、「 append()を使用してJunos XML設定データを生成する」を参照してください。

必要に応じて、 reset() メソッドを呼び出して、Tableオブジェクトのすべてのフィールドを手動でリセットすることもできます。

reset() メソッドは、すべてのフィールドを既定値に戻すか、ビューが既定値を定義していない場合はNoneに復元します。reset()メソッドは、フィールドの現在の値のみをリセットします。append() メソッドの呼び出しによってその時点までに構築された構成変更を含む XML には影響しません。

get_table_xml()メソッドを呼び出すことで、アプリケーション内の任意の時点で変更を表すXML構成を取得できます。これについては、「構成変更の表示」で詳しく説明します。

必要なオブジェクトをすべて設定し、 append()を呼び出した後、次の2つの方法のいずれかを使用して、設定変更をデバイス上の共有設定データベースに読み込むことができます。

  • set()メソッドを呼び出すと、lock()load()commit()、およびunlock()メソッドが自動的に呼び出されます

  • lock()load()commit()、およびunlock()メソッドを個別に呼び出す

注:

特定の構成モードを使用する mode パラメーターを含むコンテキストマネージャー (with ... as 構文) を使用してテーブルインスタンスを作成すると、コンテキストマネージャーはデータベースのオープンとロック、およびクローズとロック解除を処理します。この場合、load()メソッドとcommit()メソッドを呼び出すだけでデバイスを設定できます。lock() メソッドまたは set() メソッドを呼び出すと、LockError例外が発生します。

単一の set() メソッドを使用するとシンプルになりますが、個々のメソッドを呼び出すと、設定データの読み込み後、コミットする前に他のメソッドを呼び出す必要がある場合など、柔軟性が向上します。例えば、データを読み込んだ後、コミットする前に、 diff() メソッドや pdiff() メソッドを呼び出して、設定の違いを確認することができます。または、 rollback() メソッドを呼び出して、候補の設定をコミットするのではなく、アクティブな設定にリセットする必要がある場合があります。設定データの読み込みとコミットにさまざまな方法を使用する方法の詳細については、「 Junos PyEZ を使用した Junos デバイスの設定 」および「 Junos PyEZ を使用した設定のコミット」を参照してください。

タイムアウトする可能性のある大規模な負荷およびコミット操作の場合は、set() メソッド引数リストに timeout パラメーターを含めることで、RPC タイムアウト間隔commit()調整できます。詳細については、「RPC タイムアウト間隔を制御する方法」を参照してください。

setパラメーターを指定するコンフィギュレーションテーブルはスーパーセットであり、getパラメーターを指定するコンフィギュレーションテーブルのすべての機能を備えています。Table が set または get を指定するかどうかにかかわらず、Junos PyEZ アプリケーションでも同じ方法で設定データを取得できます。設定テーブルを使用して設定データを取得する方法については、「Junos PyEZ 設定テーブルを使用して設定データを取得する」を参照してください。

fixed-formキーワードで構成されるConfigureステートメント

リーフステートメントは、他のステートメントを含まないCLI設定ステートメントです。ほとんどのリーフステートメントは、設定オブジェクトの1つの特性に対する値を定義し、以下の形式を持っています。

一部のリーフステートメントは、固定形式のキーワードのみで構成されており、関連する変数形式の値はありません。例えば、[edit system services]階層レベルのftpステートメントは、固定形式キーワードの一例です。

Junos XML APIは、このようなステートメントを空のタグで表します。

Junos PyEZアプリケーションで、[edit system services]の下のftpステートメントなどの固定形式キーワードを設定するには、ビューで定義されている対応するフィールド名の値をブール値Trueと等しく設定します。

フィールドの値がブール値になるように、型制約で ftp フィールドを定義する次のビューを考えてみましょう。

Junos PyEZアプリケーションで ftp フィールドを設定するには、フィールドを Trueに設定します。

同じステートメントに複数の値を設定する

一部のJunos OSリーフステートメントは、ユーザーが定義した値または事前定義された値のセットから抽出された複数の値を受け入れます。CLI表記では、次のように、角括弧を使用してすべての値を1つのステートメントで囲みます。

例えば、以下の設定のように、トランクインターフェイスのVLAN IDリストを設定する必要がある場合があります。

Junos PyEZアプリケーションで複数の値を持つリーフステートメントを設定するには、対応するフィールド(ビューで定義)の値を、目的の値を含むPythonのリストと等しく設定します。次の例では、 vlan_list フィールドがCLIの vlan-id-list ステートメントにマッピングされています。複数のVLAN IDを持つステートメントを設定するには、フィールド名をIDのリストと等しく設定します。

注:Junos PyEZアプリケーションのフィールドの値に使用するPythonリストは、カンマ区切りの値のリストです。このリストは、Junos設定データでスペース区切りのリストに変換されます。

同じステートメントの複数のインスタンスを設定する

特定の状況では、Junos OS設定により、同じステートメントの複数のインスタンスを設定できます。例えば、論理インターフェイスに同じプロトコルファミリーで複数のアドレスを設定することができます。以下の設定スニペットでは、ループバックインターフェイスに [edit interfaces lo0 unit 0 family inet] 階層レベルで設定された複数のアドレスがあります。

設定の Junos XML 表現は次のとおりです。

Junos PyEZ設定テーブルを使用して構造化リソースを管理する場合、対応するフィールド名を目的の値と等しく設定することで、設定ステートメントの値を定義します。ただし、2番目の値が最初の値を上書きするため、Junos PyEZアプリケーションで同じフィールドを2回定義することはできません。代わりに、フィールドを値のリストと等しく設定する必要があり、Junos PyEZがXMLへの変換を処理します。

次の表とビューを考えてみましょう。

次のサンプルコードは、Junos PyEZアプリケーションでループバックインターフェイスに複数のアドレスを設定する方法を示しています。ここでは、 ip_address フィールドをアドレスのリストに設定します。

結果のコンフィギュレーションは次のようになります。

同じリソースの複数のインスタンスを設定する

Junos PyEZ設定テーブルを使用して構造化リソースを設定する場合、同じリソースに対して複数のオブジェクトまたはレコードを設定する必要がある場合があります。例えば、複数のインターフェイスやユーザーを同時に設定できます。Junos PyEZアプリケーションで同じ構造化リソースに対して複数のオブジェクトを設定するには、1つのオブジェクトのフィールドの値を定義し、 append() メソッドを呼び出してから、後続のオブジェクトごとにこのプロセスを繰り返す必要があります。

例えば、複数のユーザーを設定するには、最初のユーザーのフィールド値を定義し、 append() メソッドを呼び出します。次に、2 人目のユーザーのフィールド値を定義し、 append() メソッドを呼び出します。 append() メソッドは、設定変更用のJunos XMLデータを構築し、設定変更の完全なセットを格納する lxml オブジェクトに追加します。また、このメソッドは、すべてのフィールドをビューで定義された既定値に自動的にリセットするか、フィールドに既定値が定義されていない場合は None にリセットします。

次の例では、2 つのユーザー オブジェクトを設定し、変更をコミットします。

注:

同じリソースに対して複数のオブジェクトのいずれかを設定した後に append() メソッドを呼び出さない場合、2番目のオブジェクトのフィールド値が最初のオブジェクトのフィールド値を上書きします。

次のサンプル コードでは、よりコンパクトな構文を使用して、同じ 2 人のユーザーを設定します。

コンテナまたはリーフステートメントの削除

場合によっては、設定内のコンテナやリーフステートメントを削除する必要があるかもしれません。Junos PyEZ 構成テーブルを使用して構造化リソースを管理する場合、適切なフィールド値を {'operation' : 'delete'} に設定することで、アプリケーションでこの操作を実行できます。コンテナーまたはリーフステートメントを削除するときは、削除をどのオブジェクトに適用するかを示すために、必ずすべてのキーフィールドに値を定義する必要があります。

以下のJunos PyEZ設定表とビューを考えてみましょう。

テーブルとビューで定義されたリソースのリーフ・ステートメントを削除するには、そのステートメントに対応するフィールドの値を{'operation' : 'delete'}に設定します。以下の例では、ユーザーjsmithuidステートメントを削除します。

設定からコンテナを削除するには、ビューでそのコンテナのフィールドを定義する必要があります。テーブルとビューの例では、set プロパティで定義されている構成スコープはsystem/loginです。ビューは、system/login/userコンテナにマップされるフィールド「user」を定義します。この定義により、必要に応じてユーザーオブジェクトを削除できます。コンテナのフィールドを定義しない場合、コンテナ内のステートメントのみを削除できますが、コンテナ自体を削除することはできません。

Junos PyEZアプリケーションでコンテナを削除するには、コンテナに対応するフィールドの値を {'operation' : 'delete'}に設定し、削除するオブジェクトを示すキーフィールドを定義します。次の例では、設定からユーザー jsmith を削除します。

アプリケーションは、 get_table_xml() メソッドによって返されたJunos XML設定データを出力します。識別子「jsmith」を持つuser要素には、設定からそのオブジェクトを削除するようにJunos OSに指示する operation="delete" 属性が含まれています。

Junos XML 属性に対応するプロパティを設定する

deactivateprotectなどの一部の設定モードコマンドは、inactiveやprotectプロパティなどの特定のプロパティを設定ステートメントに適用または削除します。CLI では、このプロパティは設定ステートメントの前のタグによって示されます。Junos XML 設定では、オブジェクトの XML 属性を使用してこのプロパティを示します。

例えば、次のコマンドは、指定されたインターフェイスを非アクティブ化します。

CLIで設定を表示すると、 inactive タグがインターフェイス名の前に表示されます。

同様に、Junos XML出力では、同じインターフェイスの <interface> 要素に inactive="inactive" 属性が含まれています。

Junos PyEZ設定テーブルでは、構造化リソースを設定する際に、オブジェクトにサポートされているXML属性を定義することができます。以下のJunos PyEZ設定表とビューを考えてみましょう。

特定の設定オブジェクトの XML 属性を定義するには、そのフィールド (ビューで定義された) を、属性とその値を含む辞書に設定します。例えば、インターフェイスを定義してすぐに非アクティブにするには、 <interface> 要素に対応するフィールドを {'inactive':'inactive'}に設定します。次の例では、指定されたインターフェイスを設定および非アクティブ化します。

アプリケーションは、 get_table_xml() メソッドによって返されたJunos XML設定データを出力します。識別子「ge-1/0/2」を持つインターフェイス要素には、 inactive="inactive" 属性が含まれています。

非アクティブなオブジェクトをアクティブにするには、非アクティブなオブジェクトに対応するビューフィールドを {'active':'active'}に設定します。

同様に、設定要素を保護するには、または保護された要素から protect 属性を削除するには、適切なフィールド値を {'protect':'protect'} または {'unprotect':'unprotect'}に設定します。Junos OS設定のXML属性の詳細については、 Junos XML管理プロトコル開発者ガイド を参照してください。

append()を使用してJunos XML設定データを生成

Junos PyEZ 設定テーブルを使用して構造化リソースを設定する場合は、リソースのフィールドの値を定義してから、 append() メソッドを呼び出します。 append() メソッドを呼び出すたびに、現在の変更セットに対するJunos XML 設定データが生成され、設定変更の完全なセットが格納されている lxml オブジェクトに追加されます。

append() メソッドを呼び出すと、リソースの Junos XML 構成データが生成されます。設定変更には、ビューでデフォルト値が定義されているフィールドまたはユーザー設定値があるフィールドのみが含まれます。Noneの初期値を保持しているフィールドは無視されます。

XML をビルドした後、append() メソッドは、すべてのフィールドをビューで定義された既定値にリセットするか、フィールドに既定値が定義されていない場合はNoneにリセットします。フィールドをリセットすることで、同じアプリケーションで複数のオブジェクトを設定するときに、1 つのオブジェクトにフィールド値を設定し、その後の別のオブジェクトのappend()呼び出しで意図せずその値を使用することがなくなります。したがって、append() の呼び出しごとに、すべての key-field フィールドに新しい値を定義する必要があります。

注:

一度設定変更のメインセットにノードを追加すると、操作を元に戻すことはできません。

append() メソッドは、構成変更の完全なセットを含む新しい変更のみを lxml オブジェクトに追加します。デバイス上に変更を読み込んでコミットするには、set()メソッドまたはload()メソッドとcommit()メソッドを明示的に呼び出す必要があります。

設定変更を表示する

Junos PyEZ 設定テーブルを使用して構造化リソースを設定する場合は、リソースのフィールドの値を定義してから、 append() メソッドを呼び出します。 append() メソッドを呼び出すたびに、現在の変更セットに対するJunos XML 設定データが生成され、設定変更の完全なセットが格納されている lxml オブジェクトに追加されます。場合によっては、アプリケーション内の特定の時点までに構築された設定データを確認する必要がある場合や、設定変更をデバイスにロードした後に候補設定とアクティブな設定の違いを確認したい場合があります。

変更を含むJunos XML 設定データを取得するには、Table オブジェクトの get_table_xml() メソッドを呼び出します。 get_table_xml() メソッドは、アプリケーション内でその時点までに構築された XML 構成を返します。 set() メソッドまたは load() メソッドと commit() メソッドを呼び出すと、アプリケーションはこのJunos XML設定データをデバイスに読み込み、コミットします。

次の例では、 get_table_xml() メソッドを呼び出して設定変更を取得し、それらを configXML 変数に格納します。 append() メソッドを呼び出す前に、 get_table_xml() メソッドは None を返します。したがって、アプリケーションは、戻り値が Noneでない場合にのみ、XML構成データをシリアル化して出力します。

get_table_xml()メソッドは、設定変更に対してJunos XMLデータのみを返します。また、設定変更をデバイスにロードした後、候補となる設定とアクティブな設定を比較し、変更をコミットする前に違いを確認することもできます。

違いを取得するには、 lock()load()commit()、および unlock() メソッドを個別に呼び出し、データを読み込んだ後、コミットする前に pdiff() メソッドを呼び出して構成の違いを表示します。空の引数リストを持つ pdiff() メソッドは、候補コンフィギュレーションとアクティブなコンフィギュレーションを比較し、パッチフォーマットの違いを標準出力に直接出力します。

RPCタイムアウト間隔を制御する方法

Junos PyEZ 設定テーブルを使用して構造化リソースを設定する場合、 set() メソッドまたは load() メソッドと commit() メソッドを呼び出すことで、設定変更を読み込んでコミットできます。 set() メソッドと commit() メソッドでは、 device モジュールで定義されたRPCタイムアウト値を使用します。 Device timeout プロパティに新しい値を設定しない場合、Junos PyEZはデフォルト値の30秒を使用します。

大規模な設定変更は、デフォルトまたは設定されたタイムアウト値を超え、デバイスに設定をアップロードしてコミットする前に操作がタイムアウトする可能性があります。デフォルトまたは設定されたタイムアウト間隔よりも長いロードおよびコミット時間を必要とする特定の設定変更に対応するには、アプリケーションで set() メソッドまたは commit() メソッドを呼び出すときに timeout=seconds 引数を適切な値に設定します。例えば: