Junos PyEZ を使用して Junos デバイスからファクトを取得する
Junos PyEZ デバイスの事実を理解する
Junos PyEZ は、Junos デバイスの管理と自動化を可能にする Python 向けのマイクロフレームワークです。Junos PyEZ は、各デバイスをクラスの jnpr.junos.device.Device インスタンスとしてモデル化します。Junos デバイスに接続した後、Junos PyEZ アプリケーションはデバイスに関するファクトを取得できます。デバイスファクトは、オブジェクトのfactsDevice属性としてアクセスされます。返品されたデバイスファクトに含まれるキーの詳細については、jnpr.junos.factsを参照してください。
次の例では、デバイスとSSHを介してNETCONFセッションを確立し、デバイスのファクトを印刷します。デバイスはSSHキーを使用してユーザーを認証します。
from jnpr.junos import Device
from pprint import pprint
with Device(host='router1.example.net') as dev:
pprint (dev.facts['hostname'])
pprint (dev.facts)
user1@server:~$ python3 get-facts.py
'router1'
{'2RE': True,
'HOME': '/var/home/user1',
'RE0': {'last_reboot_reason': '0x200:normal shutdown',
'mastership_state': 'master',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '25 days, 8 hours, 22 minutes, 40 seconds'},
'RE1': {'last_reboot_reason': '0x200:normal shutdown',
'mastership_state': 'backup',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '25 days, 8 hours, 23 minutes, 55 seconds'},
...
Junos PyEZ リリース 2.0.0 以前のリリースでは、アプリケーションがデバイスへの接続方法を呼び出すとDeviceopen()、Junos PyEZ は NETCONF-over-SSH 接続のデバイス ファクトを自動的に収集し、引数リストに明示的に含gather_facts=Trueめると Telnet およびシリアル コンソール接続のデバイス ファクトをDevice収集します。
Junos PyEZ リリース 2.1.0 以降、デバイスのファクトは、すべての接続タイプに対してオンデマンドで収集されます。各ファクトは、アプリケーションがその値または依存ファクトの値に初めてアクセスする際に収集され、キャッシュされます。デバイスファクトを印刷または使用する場合、以前にアクセスしたファクトはキャッシュから提供され、まだアクセスされていないファクトはデバイスから取得されます。特定のプラットフォームでファクトがサポートされていない場合、またはアプリケーションで特定の事実の価値を収集する問題が発生した場合、その事実の価値は None.
Junos PyEZは、デバイスのファクトまたは依存ファクトに初めてアクセスしたときにデバイスのファクトをキャッシュしますが、後続のアクセス時にキャッシュされた値は更新されません。デバイスファクトを更新するには、メソッドを facts_refresh() 呼び出します。メソッドは facts_refresh() 、アプリケーションの次にファクトにアクセスするときにデバイスからそれを取得し、キャッシュに現在の値を格納するように、すべてのファクトのキャッシュを空にします。
from jnpr.junos import Device
from pprint import pprint
with Device(host='router1.example.net') as dev:
pprint (dev.facts)
dev.facts_refresh()
pprint (dev.facts)
1 つのファクトまたはファクトのセットのみを更新するには、メソッドに引数をkeysfacts_refresh()含め、キャッシュからクリアするキーを指定します。例えば:
dev.facts_refresh(keys='hostname')
dev.facts_refresh(keys=('hostname','domain','master'))
Junos PyEZ リリース 2.0.0 以降、ファクトを収集する際に発生する例外は、エラーではなく警告を発生させ、スクリプトの実行を継続できるようにします。
デフォルトでは、Junos PyEZ はデバイス ファクトを辞書のようなオブジェクトとして返します。Junos PyEZ リリース 2.2.1 以降、デバイスのファクトは JSON(JavaScript Object Notation)で確認できます。ファクトの JSON 表現を表示するには、モジュールを json インポートして関数を json.dumps() 呼び出します。
from jnpr.junos import Device
import json
with Device(host='router1.example.net') as dev:
print (json.dumps(dev.facts))
例:Junos デバイスからファクトを取得する
Junos PyEZ を使用すると、Python インタラクティブ モードでコマンドを迅速に実行したり、タスクを実行するプログラムを作成したりできます。次の例では、Junosデバイスを使用してSSH上でNETCONFセッションを確立し、単純なPythonプログラムとPythonインタラクティブモードの両方を使用して、デバイスのファクトを取得して印刷します。この例では、認証に既存のSSHキーを使用しています。
JunosデバイスとのSSH経由でNETCONFセッションを確立し、デバイスのファクトを印刷するJunos PyEZアプリケーションを作成するには、次の手順に従います。
プログラム全体を以下に示します。
import sys
from jnpr.junos import Device
from jnpr.junos.exception import ConnectError
from pprint import pprint
dev = Device(host='router1.example.net')
try:
dev.open()
except ConnectError as err:
print ("Cannot connect to device: {0}".format(err))
sys.exit(1)
pprint (dev.facts['hostname'])
pprint (dev.facts)
dev.close()
Python インタラクティブ モードで同じ操作を迅速に実行することもできます。
user1@server:~$ python
Python 3.6.9 (default, Jan 26 2021, 15:33:00)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from jnpr.junos import Device
>>> from pprint import pprint
>>>
>>> dev = Device('router1.example.net')
>>> dev.open()
Device(router1.example.net)
>>>
>>> pprint (dev.facts)
{'2RE': True,
'HOME': '/var/home/user1',
'RE0': {'last_reboot_reason': '0x200:normal shutdown',
'mastership_state': 'master',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '25 days, 8 hours, 22 minutes, 40 seconds'},
'RE1': {'last_reboot_reason': '0x200:normal shutdown',
'mastership_state': 'backup',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '25 days, 8 hours, 23 minutes, 55 seconds'},
...>>>
>>> dev.close()
>>> quit()
次のビデオでは、Junos PyEZ を使用して Junos デバイスに接続し、Junos デバイスからファクトを取得する方法を示す短い Python セッションを紹介します。