Junos PyEZ Config Utilityを使用してJunosデバイスを設定する
Junos PyEZでは、Junosデバイス上で構造化および非構造化構成の変更を行うことができます。このトピックでは、 jnpr.junos.utils.config.Config ユーティリティを使用して、ASCIIテキスト、Junos XML要素、Junos OS set コマンド、またはJavaScript Object Notation(JSON)としてフォーマットされた静的またはテンプレート化された設定データで構成される非構造化設定変更を行う方法について説明します。 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()を呼び出してレスキュー設定をロードします
-
-
設定をコミットし、Junos PyEZ を使用して設定をコミットするの説明に従って、
commit()を使用して設定をコミットします -
を使用して設定のロックを解除します
unlock()
また、コンテキストマネージャ (with ... as 構文) を使用して Config オブジェクトインスタンスを作成することもできます。特定のコンフィギュレーションモードでは、このインスタンスを使用する必要があります。これらのモードでは、Junos PyEZが自動的に設定をロック/ロック解除します。詳細については、「 設定モードの指定」を参照してください。
load() 方式を使用して設定を変更する場合、設定モードの指定に加えて、読み込み操作のタイプ、設定変更の形式、および設定データのソースを指定することもできます。Configユーティリティは、Junos CLIで利用できるものと同じロード操作とフォーマットの多くをサポートしています。詳細については、次を参照してください。
設定データのソースは、ローカルサーバー上のファイル、ターゲットデバイス上のファイル、ターゲットデバイスから到達可能なURLにあるファイル、あるいは文字列、XMLオブジェクト、またはJinja2テンプレートとして指定できます。構成データ・ソースの指定については、以下のセクションを参照してください。
設定モードの指定
デフォルトでは、 Config オブジェクトを作成し、設定モードを明示的に指定しない場合、Junos PyEZは候補のグローバル設定を更新します。また、設定データベースを変更する際に使用する別の設定モードを指定することもできます。デフォルト以外のモードを指定するには、コンテキストマネージャを使用して Config オブジェクトを作成し、 mode 引数を目的のモードに設定する必要があります。サポートされているモードは、 private、 exclusive、 dynamic、 batch、 ephemeralです。
Junos PyEZを使用して、このデータベースをサポートするデバイス上の 一時設定データベース を更新できます。一時データベースは、Junos デバイスの設定更新を実行するための高速なプログラム インターフェイスを提供する代替設定データベースです。これは高度な機能であり、誤って使用すると、デバイスの動作に深刻な悪影響を与える可能性があります。詳細については、「 エフェメラル構成データベースについて」を参照してください。
デフォルト以外のモードを指定すると、コンテキストマネージャはデータベースのオープンとロック、およびデータベースのクローズとロック解除を処理します。これにより、意図せずにデータベースがロックされた状態のままになることはありません。このような場合は、 load() メソッドと commit() メソッドを呼び出すだけでデバイスを設定できます。
例えば、次のコードは 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 OS set コマンド、JSON などがあります。構成データの形式を指定するには、Config ユーティリティー load() メソッドに 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> タグで囲む必要はありません。
設定データのフォーマット |
ファイル拡張子 |
format パラメーター |
|---|---|---|
ASCII テキスト |
.conf、 .text、 .txt |
テキスト |
JavaScript Object Notation(JSON) |
.json |
JSON |
Junos OS |
。セット |
セット |
Junos XML の要素 |
.xml |
XML |
overwrite または update パラメーターが 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 Template オブジェクト |
プリロードされた Jinja2 テンプレート オブジェクト。
|
ファイル拡張子がデータの形式を示していない場合は、 |
|
ローカル Jinja2 テンプレート ファイル |
ASCII テキスト、Junos XML 要素、Junos OS
|
ファイル拡張子がデータの形式を示していない場合は、 |
|
リモート・ファイル |
Junosデバイス上、またはFTPまたはハイパーテキスト転送プロトコル(HTTP)URLを使用してJunosデバイスから到達可能なリモートURLにあるファイルへのパス。 |
ファイル拡張子がデータの形式を示していない場合は、 |
|
XML オブジェクト 糸 |
ASCIIテキスト、Junos XML要素、Junos OS |
この場合、Junos PyEZは設定データのフォーマットを自動的に検出するので、 |
ローカルファイルまたはリモートファイルからの設定データの読み込み
Junos PyEZでは、ローカルまたはリモートのファイルから、ASCIIテキスト、Junos XML要素、Junos OS set コマンド、JSONなどの形式でフォーマットされた設定データを読み込むことができます。
構成管理サーバー上のローカル・ファイルから構成データをロードするには、 load() メソッドの path パラメーターをファイルの絶対パスまたは相対パスに設定します。例えば:
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 パラメーターをリモート ファイルの FTP ロケーションまたは ハイパーテキスト転送プロトコル (HTTP) URL に設定し、読み込み操作に必要なその他のパラメーターを含めます。次に例を示します。
cu.load(url='ftp://username@ftp.hostname.net/path/filename')
cu.load(url='http://username:password@example.com/path/filename')
URLの指定に関する詳細については、Junos XMLプロトコル<ロード設定>操作のurl属性を参照してください。
ロードするコンフィギュレーション・データのフォーマットの指定にリストされているように、受け入れられるファイル拡張子の 1 つを使用してコンフィギュレーション・データのフォーマットをファイルが示していない場合は、load() メソッド・パラメーター・リストに format パラメーターを含めてフォーマットを指定する必要があります。例えば:
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 は、Junos 設定データのレンダリングに Jinja2 テンプレートを使用することをサポートしています。Jinja は Python 用のテンプレートエンジンで、事前定義されたテンプレートからドキュメントを生成できます。目的の言語のテキスト ファイルであるテンプレートは、式と変数を使用して柔軟性を提供します。JINJA2テンプレートを使用して、サポートされている設定形式のいずれかでJunos設定データを作成できます。これには、ASCIIテキスト、Junos XML要素、Junos OS set コマンド、JSONが含まれます。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 パラメーターをテンプレート変数のディクショナリに設定します。構成データの形式を示すために受け入れられるファイル拡張子の 1 つを使用しない場合は、load() メソッドのパラメーター・リストに format パラメーターを含める必要があります。
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 テンプレート オブジェクトを指定する場合は、load() メソッドの引数リストで template_path パラメーターではなく template パラメーターを使用する必要があります。
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.palletsprojects.com/en/stable/ にある Jinja2 のドキュメントを参照してください。
設定のロールバック
Junos デバイスには、プラットフォームに応じて、最後にコミットされた設定と、最大 49 個の以前の設定のコピーが保存されます。保存されている設定のいずれかにロールバックできます。これは、設定の変更によって望ましくない結果が発生し、既知の動作設定に戻したい場合に便利です。設定のロールバックは、デバイスの設定を変更するプロセスと似ていますが、設定データを読み込む代わりにロールバックを行い、候補の設定全体を以前にコミットされた設定に置き換えます。
Junos PyEZ jnpr.junos.utils.config.Config クラス rollback() メソッドを使用すると、Junos デバイスの設定をロールバックできます。設定をロールバックするには、 rollback() メソッドを呼び出し、 rb_id 引数にロールバック設定の 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() メソッドを使用してレスキュー設定を管理します。レスキュー設定に対して実行するアクションを指定するには、 rescue() method action パラメーターを目的の操作に設定します。
既存のレスキュー設定を候補の設定に読み込むには、 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 を使用して設定をコミットするを参照してください。
変更履歴
サポートされる機能は、使用しているプラットフォームとリリースによって決まります。特定の機能がお使いのプラットフォームでサポートされているかどうかを確認するには、 Feature Explorer を使用します。