Junos PyEZ 設定ユーティリティを使用して Junos デバイスを設定する
Junos PyEZ を使用すると、Junos デバイスで構造化および非構造化構成を変更できます。このトピックでは、ASCIIテキスト、Junos XML要素、Junos OSset
コマンド、またはJavaScript Object Notation(JSON)としてフォーマットされた静的またはテンプレート化された設定データで構成された非構造化設定変更をユーティリティを使用 jnpr.junos.utils.config.Config
する方法について説明します。Config
また、このユーティリティを使用すると、以前にコミットされた設定にロールバックしたり、レスキュー設定に戻すことができます。
設定プロセスの概要
Junos デバイスに正常に接続した後、ユーティリティを使用して Config
デバイスを設定するには、まずオブジェクトを Config
作成してインスタンスに Device
関連付けます。例えば:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
デフォルトでは、Junos PyEZ は候補のグローバル設定( 共有設定データベースとも呼ばれます)を更新します。設定変更を行う基本的なプロセスは、設定データベースをロックし、設定変更を読み込み、設定をコミットしてアクティブにしてから、設定データベースのロックを解除することです。Junos PyEZ Config
ユーティリティを使用して共有設定データベースで非構造化設定変更を行う場合、ここで説明する適切なインスタンスメソッドを呼び出すことで、これらのアクションを実行できます。
-
使用して
lock()
設定をロックする -
以下のいずれかのアクションを実行して、設定を変更します。
-
新しい完全な構成の読み込み時や構成の特定部分の変更時の呼び出
load()
し -
設定のロールバックの説明に従って、以前にコミットされた設定に戻す呼び出し
rollback()
-
レスキュー設定の読み込みに関する説明に従って、レスキュー設定を読み込む呼び出し
rescue()
-
-
「設定のコミット」の説明に従って、 を使用して
commit()
設定をコミットし、Junos PyEZ を使用して設定をコミットする -
を使用して設定のロックを解除する
unlock()
また、コンテキスト・マネージャー (with
... as
構文) を使用してオブジェクト・インスタンスを Config
作成することもできますが、特定の構成モードでは、オブジェクト・インスタンスを使用する必要があります。これらのモードでは、Junos PyEZ は設定を自動的にロックおよびロック解除します。詳細については、「 設定モードの指定」を参照してください。
この方法を load()
使用して設定を変更する場合、設定モードの指定に加えて、ロード操作のタイプ、設定の形式の変更、設定データのソースも指定できます。このユーティリティーは Config
、Junos CLI で使用できるのと同じロード操作とフォーマットの多くをサポートしています。詳細については、以下を参照してください。
構成データのソースをローカル サーバー上のファイル、クライアント デバイス上のファイル、クライアント デバイスから到達可能な URL のファイルとして指定することも、文字列、XML オブジェクト、Jinja2 テンプレートとして指定することもできます。設定データ ソースの指定については、以下のセクションを参照してください。
設定モードの指定
デフォルトでは、オブジェクトをConfig
作成し、コンフィギュレーション・モードを明示的に指定しない場合、Junos PyEZ は候補のグローバル・コンフィギュレーションを更新します。また、設定データベースを変更する際に使用する別の設定モードを指定することもできます。デフォルト以外のモードを指定するには、コンテキスト・マネージャーを使用してオブジェクトをConfig
作成し、引数をmode
目的のモードに設定する必要があります。サポートされているモードには、 、 exclusive
、 batch
dynamic
、および ephemeral
が含まれますprivate
。
Junos PyEZ を使用して、このデータベースをサポートするデバイス上の 一時的な設定データベース を更新できます。一時的なデータベースは、Junos デバイスの構成更新を実行するための高速プログラム インターフェイスを提供する代替の構成データベースです。これは高度な機能です。不適切に使用すると、デバイスの操作に深刻な悪影響を及ぼす可能性があります。詳細については、 一時的な設定データベースについてを参照してください。
デフォルト以外のモードを指定すると、コンテキスト・マネージャーはデータベースのオープンおよびロックおよびクローズおよびロック解除を処理します。これにより、意図せずにデータベースがロックされた状態にしておくことはありません。このような場合は、デバイスを設定するために と commit()
メソッドのみを呼び出すload()
必要があります。
例えば、次のコードは モードを configure private
使用して設定を変更し、候補コンフィギュレーションのプライベートコピーを開きます。
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() with Config(dev, mode='private') as cu: cu.load('set system services netconf traceoptions file test.log', format='set') cu.pdiff() cu.commit() dev.close()
さまざまな設定モードの詳細については、 CLIユーザーガイド と Junos PyEZを使用したJunosデバイスの設定を参照してください。
ロード操作の指定
Junos PyEZ は、Junos CLI でサポートされているのと同じ負荷操作の多くを使用して、設定変更の読み込みをサポートします。メソッドに適切なパラメーターを含めたり省略したりして、目的の負荷操作をConfig
load()
指定します。
表 1 では、サポートされている負荷操作と対応するload()
メソッドの引数について概説しています。デフォルトでは、Junos PyEZ は操作をload replace
実行します。別の負荷操作を使用するには、メソッドで対応するパラメーターを load()
にTrue
設定します。
負荷操作 |
引数 |
説明 |
初めてサポートされる Junos PyEZ リリース |
---|---|---|---|
|
|
読み込まれたコンフィギュレーションを既存のコンフィギュレーションにマージします。 |
1.0 |
|
|
設定全体をロードされた設定に置き換えます。 |
1.0 |
|
|
パッチ・ファイルからコンフィギュレーション・データを読み込みます。 |
2.4.0 |
|
– |
読み込まれたコンフィギュレーションを既存のコンフィギュレーションとマージしますが、既存のコンフィギュレーションのステートメントを、読み込まれたコンフィギュレーションでタグを |
1.0 |
|
|
読み込まれたコンフィギュレーションを既存のコンフィギュレーションと比較します。読み込まれたコンフィギュレーションで異なる各コンフィギュレーション・エレメントは、既存のコンフィギュレーション内の対応するエレメントを置き換えます。コミット操作中は、変更された構成要素の影響を受けるシステム プロセスのみが新しい設定を解析します。 |
2.1.0 |
次の例では、候補コンフィギュレーション全体をロードされたコンフィギュレーションに置き換えるという操作を実行 load override
し、候補コンフィギュレーションをコミットしてアクティブにします。
from jnpr.junos import Device from jnpr.junos.utils.config import Config config_mx = 'configs/junos-config-mx.conf' dev = Device(host='router1.example.com').open() with Config(dev, mode='exclusive') as cu: cu.load(path=config_mx, overwrite=True) cu.commit() dev.close()
読み込む設定データの形式を指定する
Junos PyEZ Config
ユーティリティを使用すると、サポートされている標準形式のいずれかを使用して Junos デバイスを設定できます。設定データを文字列、ファイル、XML オブジェクト、または Jinja2 テンプレート オブジェクトとして提供できます。ファイルには、構成データスニペットまたは Jinja2 テンプレートのいずれかを含めることができます。文字列、ファイル、またはJinja2テンプレート内で設定データを提供する場合、サポートされているデータ形式には、ASCIIテキスト、Junos XML要素、Junos OSset
コマンド、JSONが含まれます。設定データの形式を指定するには、ユーティリティ load()
メソッドに パラメーターConfig
をformat
明示的に含めるか、適切な拡張子を設定データ ファイルに追加します。形式を指定しない場合、デフォルトは XML になります。
Junos PyEZ リリース 1.2 以降、設定データを文字列として指定すると、Junos PyEZ がフォーマットを自動的に検出します。
表 2 は、設定データでサポートされている形式、およびファイル拡張子と format
パラメーターに対応する値をまとめたものです。設定データにJunos XMLのフォーマットを使用する場合、トップレベル <configuration>
タグでデータを囲む必要があります。
NETCONFセッション内で直接デバイスを設定する際に、ASCIIテキスト、Junos OS set
コマンド、または JSON として <configuration-text>
フォーマットされた設定データを、 、 <configuration-set>
、または <configuration-json>
タグで囲む必要はありません。
設定データ形式 |
ファイル拡張子 |
フォーマット パラメーター |
---|---|---|
ASCIIテキスト |
conf, .text, .txt |
テキスト |
JavaScript Object Notation(JSON) |
。Json |
Json |
Junos OS |
。設定 |
設定 |
Junos XML 要素 |
。Xml |
Xml |
または update
パラメーターが overwrite
にTrue
設定されている場合、Junos OS set
コマンド形式は使用できません。
Junos OSリリース16.1R1以降を実行するデバイスは、JSON形式での設定データの読み込みをサポートしています。
設定データの場所の指定
Junos PyEZ を使用すると、設定データを文字列、ファイル、XML オブジェクト、または Jinja2 テンプレート オブジェクトとして読み込むことができます。ファイルには、構成データスニペットまたは Jinja2 テンプレートのいずれかを含めることができます。
表 3 は、構成データを load()
渡したり、その場所を参照するために使用するメソッド パラメーターをまとめたものです。ファイル拡張子で示された形式を持つ文字列、XML オブジェクト、またはファイルを使用する format
場合を除き、メソッド呼び出しに パラメーターを含めることで、データの形式を常に指定する必要があります。Jinja2テンプレートを使用する場合は、必要なテンプレート変数の辞書に渡すパラメータを含めます template_vars
。
パラメーター |
構成データ ソース |
説明 |
|
---|---|---|---|
|
ローカル ファイル |
ASCII テキスト、Junos XML 要素、Junos OS |
ファイル拡張子が |
|
Jinja2 テンプレート オブジェクト |
事前に読み込まれた Jinja2 テンプレート オブジェクト。 メソッドの引数リストに |
ファイル拡張子が |
|
ローカル Jinja2 テンプレート ファイル |
ASCII テキスト、Junos XML 要素、Junos OS メソッドの引数リストに |
ファイル拡張子が |
|
リモート ファイル |
Junos デバイス上または Junos デバイスから到達可能なリモート URL にあるファイルへのパス。FTP または HTTP(ハイパーテキスト転送プロトコル)URL を使用します。 |
ファイル拡張子が |
|
XML オブジェクト 文字列 |
XML オブジェクト、または ASCII テキスト、Junos XML 要素、Junos OS |
この場合、Junos PyEZ は設定データの形式を自動的に検出します |
ローカルまたはリモートファイルから設定データを読み込む
Junos PyEZを使用すると、ASCIIテキスト、Junos XML要素、Junos OS set
コマンド、またはJSONとしてフォーマットされた設定データをローカルまたはリモートのファイルから読み込むことができます。
構成管理サーバー上のローカル ファイルから構成データを読み込むには、メソッドのパラメーターをファイルのpath
絶対パスまたは相対パスに設定 load()
します。例えば:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() conf_file = 'configs/junos-config-interfaces.conf' with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit() dev.close()
また、Junos デバイス上のファイルや、Junos デバイスから到達可能な URL から設定データを読み込むことも可能です。Junos デバイス上のファイルから設定データを読み込むには、クライアント デバイス上のファイルの絶対パスまたは相対パスにパラメーターを設定 url
し、ロード操作に必要なその他のパラメーターを含めます。例えば:
cu.load(url='/var/home/user/golden.conf')
url
し、ロード操作に必要なその他のパラメーターを含めます。例えば:
cu.load(url='ftp://username@ftp.hostname.net/path/filename')
cu.load(url='http://username:password@example.com/path/filename')
URL の指定の詳細については、 Junos XML プロトコル<load-configuration> 操作の属性を参照してくださいurl
。
ファイルが読み込む構成データの形式の指定に記載されている通り、受け入れ可能なファイル拡張子のいずれかを使用して 、構成データの形式を示していない場合は、メソッド パラメーター リストに パラメーターを format
含めて形式を load()
指定する必要があります。例えば:
conf_file = 'configs/junos-config-interfaces' cu.load(path=conf_file, format='text', merge=True)
Jinja2テンプレートまたはテンプレートファイルからの設定データの読み込みについては、 Jinja2テンプレートを使用して設定データを読み込むを参照してください。
文字列から設定データを読み込む
ASCIIテキストとしてフォーマットされた設定データを読み込むには、Junos XML要素、Junos OS set
コマンド、または JSON を文字列から、メソッドの引数リストの最初の引数に文字列を load()
含めます。Junos PyEZ は文字列内の設定データの形式を自動的に検出するため format
、この場合はパラメータはオプションです。
次のコードスニペットは、さまざまな形式の設定データと対応するメソッドの呼び出しを含む、サンプルのマルチライン文字列を load()
示しています。オプション format
のパラメーターは、明確にするために各例に明示的に含まれています。例では、 cu
ユーティリティの Config
インスタンスで、ターゲットのJunosデバイスで動作します。
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
ASCIIテキストとしてフォーマットされた設定データの場合:
config_text = """ system { scripts { op { file test.slax; } } } """
リストの最初の引数として文字列を指定して、構成データを読み込み、オプションで を指定します
format="text"
。cu.load(config_text, format='text', merge=True)
Junos XML としてフォーマットされた設定データの場合:
config_xml = """ <configuration> <system> <scripts> <op> <file> <name>test.slax</name> </file> </op> </scripts> </system> </configuration> """
リストの最初の引数として文字列を指定して、構成データを読み込み、オプションで を指定します
format="xml"
。cu.load(config_xml, format='xml', merge=True)
Junos OS
set
コマンドとしてフォーマットされた設定データの場合:config_set = """ set system scripts op file test.slax """
リストの最初の引数として文字列を指定して、構成データを読み込み、オプションで を指定します
format="set"
。cu.load(config_set, format='set', merge=True)
JSONを使用してフォーマットされた設定データの場合:
config_json = """{ "configuration" : { "system" : { "scripts" : { "op" : { "file" : [ { "name" : "test.slax" } ] } } } } }"""
リストの最初の引数として文字列を指定して、構成データを読み込み、オプションで を指定します
format="json"
。cu.load(config_json, format='json', merge=True)
XML オブジェクトとしてフォーマットされた設定データの読み込み
XML オブジェクトとしてフォーマットされた構成データを読み込むには、メソッド引数リストの最初の引数としてオブジェクトを load()
含め、その他の必要なパラメーターを指定します。構成データの既定の形式は XML であるため、メソッド呼び出しにパラメーターを format
明示的に含める必要はありません。
次のコードは、XML オブジェクトと、メソッドへの対応する呼び出しを load()
提示します。
from jnpr.junos import Device from jnpr.junos.utils.config import Config from lxml.builder import E config_xml_obj = ( E.configuration( # create an Element called "configuration" E.system( E.scripts( E.op ( E.file ( E.name("test.slax"), ) ) ) ) ) ) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(config_xml_obj, merge=True) cu.commit()
Jinja2テンプレートを使用した設定データの読み込み
Junos PyEZ は、Jinja2 テンプレートを使用して Junos 設定データをレンダリングすることをサポートしています。JinjaはPython用のテンプレートエンジンで、定義済みのテンプレートからドキュメントを生成できます。テンプレートは、目的の言語のテキスト ファイルであり、式と変数を使用する柔軟性を提供します。ASCIIテキスト、Junos XML要素、Junos OS set
コマンド、JSONを含む、サポートされている設定形式のいずれかで、Jinja2テンプレートを使用してJunos設定データを作成できます。Junos PyEZ は、Jinja2 テンプレートと指定された変数辞書を使用して設定データをレンダリングします。
Jinja2 テンプレートは、特に類似の設定スタンザに対して、設定データを生成する強力な方法を提供します。例えば、デバイス上の各インターフェイスに同じ設定ステートメントを手動で追加するのではなく、インターフェイスのリストを繰り返し作成し、各インターフェイスに必要な設定ステートメントを作成するテンプレートを作成できます。Jinjaでは、ブロックは「」と「{%
%}
」で区切られ、変数は「」と「{{
}}
」で囲まれています。
以下のサンプル Jinja2 テンプレートは、特定のリスト内の各インターフェイスの論理ユニット 0 で MPLS を有効にする設定データを生成し、MPLS および RSVP プロトコルの下でインターフェイスを設定します。
interfaces { {% for item in interfaces %} {{ item }} { description "{{ description }}"; unit 0 { family {{ family }}; } } {% endfor %} } protocols { mpls { {% for item in interfaces %} interface {{ item }}; {% endfor %} } rsvp { {% for item in interfaces %} interface {{ item }}; {% endfor %} } }
Junos PyEZコードでは、Jinja2テンプレート変数の対応する辞書は次のとおりです。
config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' }
Junos PyEZ コードで Jinja2 テンプレートを読み込むには、テンプレート ファイルのパスにパラメーターを設定template_path
し、パラメーターをtemplate_vars
テンプレート変数辞書に設定します。受け入れ可能なファイル拡張子のいずれかを使用して構成データの形式を示さない場合は、メソッド パラメーター リストに パラメーターをformat
load()
含める必要があります。
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces-mpls.conf' config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' } with Device(host='router1.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(template_path=conf_file, template_vars=config_vars, merge=True) cu.commit()
読み込み済みの Jinja2 Template オブジェクトを指定する場合は、メソッドの引数リストでパラメーターのtemplate_path
代わりに パラメーターを使用template
するload()
必要があります。
Junos PyEZは、Jinja2テンプレートと変数辞書を使用して以下の設定データをレンダリングし、その後候補のコンフィギュレーションに読み込み、デバイスでコミットします。
interfaces { ge-1/0/1 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/2 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/3 { description "MPLS interface"; unit 0 { family mpls; } } } protocols { mpls { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } rsvp { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } }
次のビデオでは、Jinja2テンプレートを使用してJunosデバイスを設定する方法を示す簡単なPythonセッションを紹介します。
Jinja2の詳細については、 https://jinja.pocoo.org/docs/ のJinja2ドキュメントを参照してください。
設定のロールバック
Junosデバイスには、プラットフォームに応じて、直近にコミットされた設定のコピーと最大49個の以前の設定のコピーが保存されます。保存されているコンフィギュレーションにロールバックできます。これは、設定変更によって望ましくない結果が発生し、既知の正常な設定に戻したい場合に便利です。設定のロール バックは、デバイスで設定を変更するプロセスと似ていますが、設定データを読み込む代わりに、ロールバックを実行すると、候補となる設定全体が以前にコミットされた設定に置き換えられます。
Junos PyEZ jnpr.junos.utils.config.Config
クラス rollback()
メソッドを使用すると、Junos デバイスで設定をロールバックできます。設定をロールバックするには、メソッドを rollback()
呼び出し、ロールバック設定のIDに引数を設定 rb_id
します。有効な ID 値は、0(直近にコミットされた設定ではゼロ)から、保存された以前の設定数よりも 1 少ない値(最大 49)。です。メソッド呼び出しでこのパラメーターを省略すると、デフォルトは 0 になります。
次の例では、復元する設定のロールバックIDを入力し、設定をロールバックして、設定の違いを印刷してから、設定をコミットしてデバイス上でアクティブな設定にします。
from jnpr.junos import Device from jnpr.junos.utils.config import Config rollback_id = int(input('Rollback ID of the configuration to restore: ')) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.rollback(rb_id=rollback_id) cu.pdiff() cu.commit()
user@server:~$ python3 junos-pyez-rollback.py Rollback ID of the configuration to restore: 1 [edit interfaces] - ge-0/0/1 { - unit 0 { - family inet { - address 198.51.100.1/24; - } - } - }
エラー処理を含む、より広範な例については、「 例: Junos PyEZ を使用して設定をロールバックする」を参照してください。
レスキュー設定の読み込み
レスキュー設定では、既知の機能する設定や、いつでも復元できる既知の状態の設定を定義できます。レスキュー設定は、既知の設定に戻す必要がある場合、またはルーターやスイッチの設定やバックアップ設定ファイルが修理を超えて損傷した場合に最後のリゾートとして使用します。レスキュー設定を作成すると、デバイスは最近コミットされた設定をレスキュー設定として保存します。
Junos PyEZ jnpr.junos.utils.config.Config
ユーティリティを使用すると、Junos デバイスでレスキュー設定を管理できます。クラスのConfig
インスタンスを作成した後、 メソッドを rescue()
使用してレスキュー設定を管理します。レスキュー設定で実行するアクションを指定するには、メソッド action
パラメータをrescue()
目的の操作に設定します。
既存のレスキュー設定を候補コンフィギュレーションに読み込むには、 を指定します action="reload"
。レスキュー設定が存在しない場合、ロード操作は を返します False
。レスキュー設定を読み込んだ後、設定をコミットしてデバイス上でアクティブな設定にする必要があります。
次の例では、レスキュー設定がある場合、レスキュー設定を読み込み、コミットします。
from jnpr.junos import Device from jnpr.junos.utils.config import Config with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: rescue = cu.rescue(action='reload') if rescue is False: print ('No existing rescue configuration.') else: cu.pdiff() cu.commit()
レスキュー設定の作成、取得、削除、その他の例については、 Junos PyEZ を使用した Junos デバイスでのレスキュー設定の管理を参照してください。
設定のコミット
設定を変更した後、設定をコミットしてデバイス上でアクティブな設定にする必要があります。ユーティリティを Config
使用してデバイス上で非構造化構成を変更する場合、 メソッドを呼び出して候補のコンフィギュレーションを commit()
コミットします。
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces.conf' with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit()
Junos PyEZ スクリプトにおけるコミット操作とサポートされているコミット オプションの詳細については、「 Junos PyEZ を使用して設定をコミットする」を参照してください。