使用 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 和早期版本中,当应用程序调用Device
open()
连接到设备的方法时,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 设备连接并检索事实。