Junos PyEZ 設定ユーティリティを使用して Junos デバイスを設定する
Junos PyEZを使用すると、Junosデバイス上で構造化および非構造化の設定変更を行うことができます。このトピックでは、ASCIIテキスト、Junos XMLエレメント、Junos OSset
コマンド、またはJavaScriptオブジェクト記法(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()
-
-
「設定をコミットする」および「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デバイスで設定更新を実行するための高速なプログラムインターフェイスを提供する代替設定データベースです。これは高度な機能であり、誤って使用するとデバイスの動作に深刻な悪影響を与える可能性があります。詳細については、「 エフェメラル構成データベースについて」を参照してください。
デフォルト以外のモードを指定すると、コンテキストマネージャはデータベースのオープンとロック、およびクローズとロック解除を処理します。これにより、意図せずにデータベースをロック状態のままにすることがなくなります。このような場合は、 および 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 OS set
コマンド、および JSON が含まれます。構成データの形式を指定するには、ユーティリティ load()
メソッドにパラメーターをformat
明示的に含めるか、Config
構成データ ファイルに適切な拡張子を追加します。形式を指定しない場合、デフォルトは 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 デバイス上、または FTP またはハイパーテキスト転送プロトコル(HTTP)URL を使用して Junos デバイスから到達可能なリモート URL にあるファイルへのパス。 |
ファイル拡張子がデータの形式を示していない場合は、 |
|
XML オブジェクト 文字列 |
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
。
「読み込む構成データの形式を指定する」に記載されている、受け入れられるファイル拡張子のいずれかを使用して構成ファイルが構成データの形式を示さない場合は、メソッド パラメーター リストにパラメーター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
はターゲット Junos デバイス上で動作するユーティリティの Config
インスタンスです。
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 用のテンプレート エンジンです。テンプレートは、目的の言語のテキスト ファイルであり、式と変数を使用して柔軟性を提供します。Junos 設定データは、Jinja2 テンプレートを使用して、サポートされている設定形式(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 Template オブジェクトを指定する場合は、メソッド引数リストのパラメーター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.pocoo.org/docs/ にある Jinja2 のドキュメントを参照してください。
設定のロールバック
Junosデバイスには、プラットフォームによってによって、直近にコミットされた設定のコピーと、それ以前の設定が最大49個保存されます。保存されている任意の設定にロールバックできます。これは、設定の変更によって望ましくない結果が生じ、動作確認済みの設定に戻したい場合に有効です。設定のロールバックは、デバイスの設定変更を行うプロセスと似ていますが、設定データを読み込む代わりに、ロールバックを実行し、候補の設定全体を以前にコミットした設定に置き換えます。
Junos PyEZ jnpr.junos.utils.config.Config
クラスの rollback()
メソッドを使用すると、Junosデバイスの設定をロールバックできます。設定をロールバックするには、メソッド と を rollback()
呼び出し、引数を rb_id
ロールバック設定の ID に設定します。有効なID値は、0(直近にコミットされた設定の場合はゼロ)から、以前の設定の保存数(最大49)より1つ減らした値です。メソッド呼び出しでこのパラメーターを省略すると、既定値は 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()
メソッドを使用してレスキュー構成を管理します。レスキュー設定で実行するアクションを指定するには、method 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を使用して設定をコミットするを参照してください。
変更履歴テーブル
機能のサポートは、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がプラットフォームでサポートされているかどうかを判断します。