定义 Junos PyEZ 配置表
总结 创建自定义表,用于在 Junos 设备上配置特定资源或从设备提取配置数据。
定义 Junos PyEZ 配置表是为了从 Junos 设备的选定配置数据库中提取特定数据,或创建可用于以编程方式配置 Junos 设备的结构化资源。因此,您可以快速检索或修改设备上的特定配置对象。
Junos PyEZ 表使用 YAML 进行格式化。定义 Junos PyEZ 配置表时,必须使用 get 或 set指定配置范围。包含 get 该属性的表只能从设备检索指定的配置数据。包含该 set 属性的表定义可用于配置设备以及从设备检索配置数据的配置资源。因此,它们是一个超集,包括指定 get.
配置表定义可以包括许多必需参数和可选参数。 表 1 汇总了这些参数,并指定该参数是可以在仅从设备 (get) 检索配置数据的表中使用,还是在也可以配置设备 (set) 的表中使用该参数。
表参数名称 |
表参数 |
表类型 |
描述 |
|---|---|---|---|
表名 |
– |
|
用户定义的表标识符。 |
配置范围 |
|
— |
相对于顶级 指定 这些对象将成为关联视图的引用。 |
配置资源键字段 |
|
|
引用视图中定义的任何字段名称的字符串或字符串列表,这些字段名称映射到标识符元素,并可用于唯一标识配置对象。例如,可以指定与 您必须始终在表中定义至少一个键字段,并且用户在其应用程序中配置资源时必须声明所有键的值。 |
必需的密钥 |
|
|
(可选)键值对的关联数组或字典,用于将配置作用域中的层次结构级别映射到在该层次结构级别唯一标识对象的元素,例如元素 在应用程序中检索配置数据时,用户必须包含所有必需的键作为方法的 |
表视图 |
|
|
与表关联的视图。 |
请考虑以下 Junos PyEZ 配置表及其关联的视图。 UserTable(包括属性) get 提取目标设备上用户帐户的配置数据。 UserConfigTable(包括该 set 属性)定义结构化配置资源,该资源可用于在目标设备上配置用户帐户以及检索用户帐户的配置数据。
---
UserTable:
get: system/login/user
required_keys:
user: name
view: UserView
UserView:
fields:
username: name
userclass: class
uid: uid
UserConfigTable:
set: system/login/user
key-field:
username
required_keys:
user: name
view: UserConfigView
UserConfigView:
fields:
username: name
userclass: class
uid: uid
password: authentication/encrypted-password
fullname: full-name
以下各节讨论表的不同组件:
表名
表名称是表的用户定义标识符。YAML 文件或字符串可以包含一个或多个表。YAML 文档的开头必须左对齐。例如:
--- UserTable: # Table definition
配置范围(获取或设置)
所有配置表定义中都需要的配置范围属性标识要检索或配置对象的配置层次结构级别,具体取决于表类型。Junos PyEZ 配置表可用于检索和修改 Junos 设备上的配置数据。指定属性的 get 配置表只能检索配置数据。指定属性的 set 配置表可以配置和检索数据。
get或set的值是相对于顶级<configuration>元素的 XPath 表达式,该顶级元素标识要在其中检索或设置配置数据的层次结构级别。此数据将成为关联视图的引用。
请考虑以下示例配置层次结构:
user@router> show configuration system login | display xml
<rpc-reply>
<configuration>
<system>
<login>
...
<user>
<name>user1</name>
<uid>2001</uid>
<class>super-user</class>
<authentication>
<encrypted-password>...</encrypted-password>
</authentication>
</user>
<user>
<name>readonly</name>
<uid>3001</uid>
<class>read-only</class>
<authentication>
<encrypted-password>...</encrypted-password>
</authentication>
</user>
</login>
</system>
</configuration>
</rpc-reply>
若要在层次结构级别检索或配置user元素,or set 属性的值get将使用以下[edit system login]表达式:
system/login/user
不要在 XPath 表达式的末尾包含斜杠 ( / ),因为脚本将生成错误。
例如,要定义只能用于检索 user 对象的表, get请使用 。
get: system/login/user
要定义除了检索对象之外还可用于配置 user 对象的表, set请使用 。
set: system/login/user
默认情况下,Junos PyEZ 配置表从候选配置数据库中检索数据。在 Python 脚本中调用 get() 该方法以检索表数据时,可以指定该方法应改为通过传入 options 参数并将该项包含在 'database':'committed' 字典中 options 来从提交的配置数据库返回数据。例如:
table_object.get(options={'database':'committed'})
关键字段(键字段)
在 Junos OS 配置中,配置对象的每个实例(例如,接口或用户帐户)都必须具有唯一标识符。在许多情况下, <name> 在 Junos XML 输出中显式显示的元素可以唯一标识对象的每个实例。但是,在某些情况下,会使用不同的元素或元素组合。例如,逻辑接口由物理接口名称和逻辑单元号的组合唯一标识。
指定 set 用于定义配置资源的属性的配置表必须指示哪个元素或元素组合唯一标识该资源。该 key-field 属性是一个字符串或字符串列表,用于此功能,并且是所有 set 配置表所必需的。
表的 set 视图必须为配置资源的所有标识符元素显式定义字段。然后,该 key-field 属性必须引用表定义中标识符元素的所有字段名称。使用表配置资源时,Junos PyEZ 应用程序必须提供所有关键字段的值。
例如,下表定义了可用于在层次结构级别配置 [edit system login] 用户帐户的结构化资源。视图显式定义字段 username 并将其映射到 name 层次结构级别的元素 [edit system login user] 。 key-field 该属性引用此字段以 name 指示元素唯一标识该对象的实例。
UserConfigTable:
set: system/login/user
key-field:
username
required_keys:
user: name
view: UserConfigView
UserConfigView:
fields:
username: name
userclass: class
uid: uid
password: authentication/encrypted-password
fullname: full-name
当 Junos PyEZ 应用程序在设备上配置资源的实例 UserConfigTable 时,它必须为每个 username 实例的密钥定义一个值。例如:
from jnpr.junos import Device
from myTables.ConfigTables import UserConfigTable
with Device(host='router1.example.com') as dev:
users = UserConfigTable(dev)
users.username = 'admin'
users.userclass = 'super-user'
...
如果配置表为多个层次结构级别中的语句定义了字段,并且每个级别都有标识符, key-field 则该属性必须包含所有标识符。例如,如果 Table 在接口上配置逻辑单元, key-field 则该属性必须包含接口名称和逻辑单元号作为键。
必需的密钥 (required_keys)
在配置表定义中包含可选 required_keys 属性,以要求表用户在其应用程序中检索数据时为一个或多个键提供值。每个键都必须将 or get set 参数定义的配置作用域中的层次结构级别映射到 <name> 该级别的标识符。每个层次结构级别只能定义一个键。
在以下示例中, UserTable 要求 Junos PyEZ 应用程序在检索数据时在层次结构级别指定[edit system login user]元素的值name:
UserTable:
get: system/login/user
required_keys:
user: name
view: UserView
在相应的 Junos PyEZ 脚本中,必须在方法参数列表中包含所需的密钥 get() 。以下示例请求名为“readonly”的用户的配置数据:
from jnpr.junos import Device
from myTables.ConfigTables import UserTable
with Device(host='router1.example.com') as dev:
users = UserTable(dev)
users.get(user='readonly')
在由 or get set 参数定义的配置作用域中,只能需要层次结构级别的键。请考虑以下定义 get:
get: interfaces/interface/unit
在这种情况下,您可以请求用户提供接口名称和单元号的值,如以下示例代码所示,但不能为接口地址定义必需的键,该地址位于较低的层次结构级别:
required_keys:
interface: name
unit: name
表视图(视图)
该 view 属性将表定义与特定视图相关联。视图使用 XPath 表达式将用户定义的字段名称映射到所选表项目中的元素。您可以将视图自定义为仅选择要检索或配置的某些元素,具体取决于表类型和操作。
有关为配置表定义视图的详细信息,请参阅 定义 Junos PyEZ 配置表的视图。