このページの目次
例:Junos PyEZ を使用してファイルから設定データを読み込む
Junos PyEZライブラリを使用すると、Junosデバイスの運用タスクや設定タスクを実行できます。この例では、Junos PyEZ jnpr.junos.utils.config.Config
ユーティリティを使用して、構成管理サーバー上のローカル ファイルから Junos デバイスに構成データを読み込みます。
要件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
Python 3.5 以降および Junos PyEZ リリース 2.0 以降を実行する構成管理サーバー
NETCONFが有効で、適切な権限で設定されたユーザーアカウントを備えたJunosデバイス
サーバーとJunosデバイス上の適切なユーザーに対して設定されたSSH公開鍵と秘密鍵のペア
概要
この例では、Junos PyEZ Config
ユーティリティを使用して、指定したデバイスの設定で新しいopスクリプトを有効にするPythonアプリケーションを紹介します。構成管理サーバー上にある junos-config-add-op-script.conf ファイルには、関連する構成データが ASCII テキストとしてフォーマットされて含まれています。
Python アプリケーションは、Junos デバイスとConfig
の接続を処理するクラス、ターゲット デバイスの非構造化構成変更に使用されるクラス、モジュールからのjnpr.junos.exception
必須例外(Junos デバイスの管理時に発生する例外を含む)をインポートDevice
します。この例では、Config
クラスのインスタンスConfig
のスタンドアロン変数を作成するのではなく、Device
インスタンスをインスタンスにバインドします。
ターゲット デバイスのインスタンスを作成 Device
した後、メソッドは open()
デバイスとの接続と NETCONF セッションを確立します。次に、このユーティリティ・メソッドは Config
、候補コンフィギュレーションをロックし、コンフィギュレーションの変更を操作として load merge
候補コンフィギュレーションに読み込み、候補コンフィギュレーションをコミットしてから、ロックを解除します。
method path
パラメーターはload()
、構成ファイルのパスに設定されます。構成ファイルの拡張子は構成データの形式を示すため、パラメーターはformat
引数リストから省略されます。設定はmerge=True
、デバイスが操作を実行するload merge
必要があることを示します。
設定操作が完了すると、アプリケーションはメソッド close()
を呼び出してNETCONFセッションと接続を終了します。アプリケーションには、コンフィギュレーションのロック時に発生するエラーやCommitError
、コミット操作中に発生するエラーなどの例外LockError
を処理するためのコードが含まれています。アプリケーションには、発生する可能性のある追加の例外を処理するコードも含まれています。
構成
構成データ ファイルの作成
手順
Junos PyEZアプリケーションで使用される設定データファイルを作成するには、次の手順に従います。
設定データの形式(この例ではASCIIテキスト)に基づいて、適切な拡張子を持つファイルを新たに作成します。
必要な構成変更をファイルに含めます。例を示します。
system { scripts { op { file bgp-neighbors.slax; } } }
Junos PyEZアプリケーションを作成する
手順
Junos PyEZ を使用して Junos デバイスの設定を変更する Python アプリケーションを作成するには、次の手順に従います。
必要なモジュール、クラス、およびオブジェクトをインポートします。
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
必要な変数を含めます(この例では、管理対象デバイスのホスト名と設定データを含むファイルへのパスが含まれます)。
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
main()
関数定義と関数呼び出しを作成し、残りのステートメントを定義内に配置します。def main(): if __name__ == "__main__": main()
クラスのインスタンス
Device
を作成し、その特定の接続に必要なホスト名とパラメーターを指定します。次に、接続を開き、デバイスとのNETCONFセッションを確立します。
# open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
インスタンスを
Config
インスタンスにDevice
バインドします。dev.bind(cu=Config)
設定をロックします。
# Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
構成の変更を読み込み、エラーを処理します。
print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
設定をコミットします。
print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
設定のロックを解除します。
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
NETCONF セッションを終了し、デバイスとの接続を閉じます。
# End the NETCONF session and close the connection dev.close()
結果
構成管理サーバーで、完成したアプリケーションを確認します。アプリケーションに目的のコードが表示されない場合は、この例の手順を繰り返してアプリケーションを修正します。
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf' def main(): # open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return dev.bind(cu=Config) # Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Junos PyEZ アプリケーションの実行
アプリケーションの実行
-
構成管理サーバーで、アプリケーションを実行します。
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
検証
設定の確認
目的
Junos デバイスの構成が正しく更新されたことを確認します。
アクション
Junos デバイスにログインし、設定、コミット履歴、ログ ファイルを表示して設定を確認し、コミットします。例えば:
user@dc1a> show configuration system scripts op { file bgp-neighbors.slax; }
user@dc1a> show system commit 0 2014-07-29 14:40:50 PDT by user via netconf ...
user@dc1a> show log messages Jul 29 14:40:36 dc1a sshd[75843]: Accepted publickey for user from 198.51.100.1 port 54811 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Jul 29 14:40:36 dc1a sshd[75843]: subsystem request for netconf by user user Jul 29 14:40:42 dc1a file[75846]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Loaded by example.) Jul 29 14:40:45 dc1a mspd[75888]: mspd: No member config Jul 29 14:40:45 dc1a mspd[75888]: mspd: Building package info Jul 29 14:40:51 dc1a mspd[1687]: mspd: No member config Jul 29 14:40:51 dc1a mspd[1687]: mspd: Building package info Jul 29 14:40:51 dc1a file[75846]: UI_COMMIT_COMPLETED: commit complete
意味
設定とログ ファイルの内容は、正しい設定ステートメントがデバイスで正常に設定され、コミットされたことを示しています。
トラブルシューティング
タイムアウトエラーのトラブルシューティング
問題
Junos PyEZ コードによって RpcTimeoutError メッセージまたはTimeoutExpiredError メッセージが生成され、デバイス設定の更新に失敗します。
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
NETCONF RPCがタイムアウトするデフォルトの時間は30秒です。大規模な構成変更がこの値を超えると、構成をアップロードしてコミットする前に操作がタイムアウトする可能性があります。
ソリューション
デフォルトのタイムアウト間隔よりも長いコミット時間が必要になる可能性がある設定変更に対応するには、タイムアウト間隔を適切な値に設定し、コードを再実行します。間隔を設定するには、プロパティをDevice
timeout
適切な値に設定するか、デバイスの構成データをコミットするメソッドを呼び出すcommit()
ときに引数を含めtimeout=seconds
ます。例えば:
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
設定ロックエラーのトラブルシューティング
問題
Junos PyEZコードは、設定をロックできないことを示すロックエラーメッセージを生成します。例えば:
LockError(severity: error, bad_element: None, message: configuration database modified)
構成ロック エラーは、次の理由で発生する可能性があります。
別のユーザーが構成を排他ロックしています。
共有構成データベースには、コミットされていない変更があります。
Junos PyEZコードを実行しているユーザーには、デバイスを設定する権限がありません。
ソリューション
別のユーザーが設定に排他ロックを設定した場合、または設定を変更した場合は、ロックが解除されるか変更がコミットされるまで待ってから、コードを再実行してください。問題の原因が、デバイスを構成する権限がユーザーないことである場合は、必要な権限を持つユーザーでアプリケーションを実行するか、必要に応じて、変更を行うために必要な権限を現在のユーザーに付与するように Junos デバイスを設定します。
設定変更エラーのトラブルシューティング
問題
Junos PyEZ コードは、パーミッションの問題により設定を変更できないことを示す ConfigLoadError メッセージを生成します。
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
このエラー メッセージは、Junos PyEZ コードを実行するユーザーが、設定を変更する権限はあるが、設定の必要な部分を変更する権限を持っていない場合に生成されることがあります。
ソリューション
必要なパーミッションを持つユーザーでアプリケーションを実行するか、必要に応じて、変更を行うために必要なパーミッションを現在のユーザーに付与するように Junos デバイスを設定します。