使用 Junos PyEZ 从 Junos 设备检索事实
了解 Junos PyEZ 设备事实
Junos PyEZ 是面向 Python 的一种微框架,使您能够管理和自动化 Junos 设备。Junos PyEZ 将每个设备都作为课程实 jnpr.junos.device.Device 例进行型号。连接到 Junos 设备后,Junos PyEZ 应用程序可以检索有关设备的事实。设备事实作为对象的Device属性访问facts。有关退回设备事实中包含的密钥的详细信息,请参阅 jnpr.junos.事实。
以下示例将通过 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)
要仅刷新单个事实或一组事实,请在方法中facts_refresh()包含keys该论点,并指定要从缓存中清除的密钥。例如:
dev.facts_refresh(keys='hostname')
dev.facts_refresh(keys=('hostname','domain','master'))
从 Junos PyEZ 2.0.0 版开始,收集事实时发生的例外情况会引发警告,而不是出错,从而使脚本能够继续运行。
默认情况下,Junos PyEZ 将设备事实返回为类似字典的对象。从 Junos PyEZ 版本 2.2.1 开始,您可以在 JavaScript 对象符号 (JSON) 中查看设备事实。要查看 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 PyEZ 应用程序,使用 Junos 设备在 SSH 上建立 NETCONF 会话并打印设备事实:
整个计划在这里展示:
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()
以下视频展示了一个简短的 Python 会话,演示了如何使用 Junos PyEZ 从 Junos 设备连接并检索事实。