使用 Junos PyEZ 配置表检索配置数据
Junos PyEZ 配置表和视图提供了一种简单有效的方法,可以从 Junos 设备的选定配置数据库中提取特定信息。将表定义加载或导入 Python 模块后,可以检索配置数据。
Junos PyEZ 配置指定属性的 get
表只能检索配置数据。指定 set
属性的表可以在 Junos 设备上配置资源,也可以采用与指定 get
属性的表相同的方式检索数据。
若要从特定设备检索信息,必须创建一个 Table 实例并将其与表示目标设备的对象相关联 Device
。例如:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev)
以下各节讨论如何检索和操作数据:
检索配置项目
配置表 get
或 set
属性标识要从配置中提取的数据。例如,以下示例表定义提取 user
配置层次结构级别的元素 [edit system login]
:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
您可以通过调用 get()
该方法并提供任何所需的参数来检索 Python 脚本中的配置数据。
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get()
如果表定义包含required_keys
参数,则必须在get()
方法参数列表中为每个必需的键包括键值对。以下表定义要求get()
方法参数列表包含一个user
参数,该参数的值对应于层次结构级别的元素[edit system login user]
值name
:
UserTable: get: system/login/user required_keys: user: name view: UserView
在该方法中 get()
,必须在参数列表中包含所需的键;否则,代码将引发 ValueError 异常。以下示例请求名为“operator”的用户的配置数据:
users = UserTable(dev).get(user='operator')
如果参数名称带有连字符,则必须将名称中的任何短划线更改为下划线。但是,参数值是一个字符串,因此可以包含连字符。
可以包含方法namesonly=True
参数以get()
返回仅包含表定义的 or get
set
属性中指定的层次结构级别的名称键的配置数据。
from jnpr.junos import Device from myTables.ConfigTables import InterfaceTable with Device(host='router.example.com') as dev: interfaces = InterfaceTable(dev) interfaces.get(namesonly=True)
例如,假设get
定义为在层次结构级别检索interfaces/interface
配置数据,并且在 namesonly=True
Junos PyEZ 脚本中检索数据时,请在方法中包含get()
参数。在这种情况下,该方法仅返回作为层次结构级别的interfaces/interface
直接子级元素中的<name>
值。不会返回作为元素同<name>
级元素的元素中的信息,也不会返回层次结构中较低级别的元素的数据<name>
。
指定配置数据库
默认情况下,Junos PyEZ 配置表从候选配置数据库中检索数据。在 Python 脚本中调用 get()
该方法以检索表数据时,可以指定该方法应改为通过传入 options
参数并将该项包含在 'database':'committed'
字典中 options
来从提交的配置数据库返回数据。
table_options = {'inherit':'inherit', 'groups':'groups', 'database':'committed'} with Device(host='router.example.com') as dev: users = UserTable(dev) users.get(options = table_options)
指定继承和组选项
使用方法参数列表中的参数get()
检索options
配置数据时,可以控制继承和组选项。该options
参数采用字典,默认情况下设置为以下值,该值对返回的配置数据应用继承和组:
options = {'inherit': 'inherit', 'groups': 'groups'}
如果不在 Python 脚本中重新定义 options
参数,它将自动使用默认值。
该inherit
选项指定配置数据如何显示配置组和接口范围中定义的语句。默认情况下,将包含该'inherit':'inherit'
选项,并且配置数据将从继承的标签元素的用户定义组或接口范围继承的标签元素括在继承的标签元素中,而不是单独显示 <groups>
、 <apply-groups>
<apply-groups-except>
或 <interface-range>
元素。要应用继承,但也包括组中定义的junos-defaults
语句的标记元素,'inherit':'defaults'
请在参数中使用options
。
若要禁用继承,请将字典值设置为空字符串。
{'inherit':''}
同时包含和'inherit':'inherit'
'groups':'groups'
选项会返回配置数据,这些数据还指示从中继承元素的配置组。从特定组继承的元素在其junos:group="source-group"
开始标记中包含该属性,如以下示例所示:
<configuration> <interfaces> <interface junos:group="re0"> <name junos:group="re0">fxp0</name> <unit junos:group="re0"> <name junos:group="re0">0</name> <family junos:group="re0"> <inet junos:group="re0"> <address junos:group="re0"> <name junos:group="re0">198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> ... </configuration>
若要提供对视图定义中属性的访问,可以在字段映射中包含相应的 XPath 语法。以下示例定义字段 ifgroup
并将其映射到 junos:group
接口元素 <name>
的属性:
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: name/@group
Junos PyEZ 还提供了group
运算符,这是一种访问元素属性的junos:group
快捷方式。下面的示例定义字段ifgroup
,该字段使用name
运算符映射到group
元素。在脚本中访问ifgroup
时,它会引用与接口元素<name>
关联的属性的值junos:group
。
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: { name : group }
如果元素不是从组继承的,则引用该 group
属性的字段的值为 None
。
访问表项
检索配置项后,可以将它们视为 Python 字典,这使您能够使用标准 Python 库中的方法访问和操作这些项。
要查看配置项名称对应的字典键列表,请调用 keys()
该方法。
users = UserTable(dev).get() print (users.keys())
['user1', 'readonly']
可以使用 Python in
运算符验证表项中是否存在特定键。
if 'readonly' in users:
若要查看与每个键关联的字段或值的列表,请调用该方法 values()
。该方法 values()
返回一个元组列表,其中包含视图中定义的每个字段的名称-值对。
print (users.values())
[[('username', 'user1'), ('userclass', 'super-user')], [('username', 'readonly'), ('userclass', 'read-only')]]
若要查看项的完整列表(包括键和值),请调用该方法 items()
。
print (users.items())
[('user1', [('username', 'user1'), ('userclass', 'super-user')]), ('readonly', [('username', 'readonly'), ('userclass', 'read-only')])]
循环访问表
表支持迭代,这使您能够以与循环浏览列表或字典相同的方式遍历每个配置项。这使得快速格式化和打印所需字段变得容易。
下表定义从配置数据中提取 system/login/user
各项:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
以下 Junos PyEZ 应用程序循环遍 user
历各项并打印每个用户的名称和类:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get() for user in users: print("Username is {}\nUser class is {}".format(user.username, user.userclass))
username
在 UserView 中定义的 and userclass
字段分别对应于配置数据中 和 name
class
元素的值。输出包括用户的名称和类。
Username is user1 User class is super-user Username is readonly User class is read-only
尽管 UserView 定义了一个 username
映射到元素的 name
字段,但默认情况下,每个 View 项都有一个 name
属性,该属性引用唯一标识该项的键。因此,您还可以在此示例中使用它 user.name
来引用元素的值 name
。