定义 Junos PyEZ 配置表的视图
Junos PyEZ 配置表可以从 Junos 设备的选定配置数据库中提取特定数据,也可以定义可用于以编程方式配置 Junos 设备的结构化资源。表与视图相关联,视图用于选择和引用表数据中的元素。通过将属性包含在 view
表定义中来将表与特定视图相关联,该定义将视图名称作为其参数。
视图将用户定义的字段名称映射到所选表项中的 XML 元素。视图使您能够将数据中的特定字段作为变量访问,这些变量具有可在 Python 中操作的属性。Junos PyEZ 处理将数据提取到 Python 以及任何类型的转换或数据规范化。
使用具有 get
或属性的 set
表检索配置数据时,View 字段指定应用程序应为对象检索哪些配置数据。对于包含 set
属性并定义可在设备上配置的资源的表,View 中定义的字段会限制可以为该资源配置的语句。
Junos PyEZ 视图与表一样,使用 YAML 进行格式化。与配置表关联的视图定义可以包含许多参数, 表 1 汇总了这些参数。
查看参数名称 |
查看参数 |
表类型 |
描述 |
---|---|---|---|
视图名称 |
– |
|
用户定义的视图标识符。 |
字段项 |
|
|
键值对的关联数组或字典,用于将用户定义的字段名称映射到用于选择配置数据中的元素的 XPath 表达式。字段名称必须是有效的 Python 变量名称。XPath 表达式相对于由该表的 or 当 表作用域使用 |
字段组 |
|
|
键值对的关联数组或字典,用于将用户定义的字段名称映射到用于选择配置数据中的元素的 XPath 表达式。字段名称必须是有效的 Python 变量名称。XPath 表达式相对于相应 当 表作用域使用 |
组 |
|
|
键值对的关联数组或字典,用于将用户定义的组名映射到 XPath 表达式,该表达式为该组中的字段设置 XPath 上下文。Xpath 表达式相对于由该表的 or |
请考虑以下 Junos PyEZ 配置表和视图。 UserTable
(包括属性) get
提取目标设备上用户帐户的配置数据。 UserConfigTable
(包括该 set
属性)定义结构化配置资源,该资源可用于在目标设备上配置用户帐户以及检索用户帐户的配置数据。
--- UserTable: get: system/login/user view: UserView UserView: groups: auth: authentication fields: username: name userclass: class uid: uid uidgroup: { uid: group } fullgroup: { full-name: group } fields_auth: password: encrypted-password --- UserConfigTable: set: system/login/user key-field: username view: UserConfigView UserConfigView: groups: auth: authentication fields: username: name userclass: class uid: uid fields_auth: password: encrypted-password
以下各节讨论视图的不同组件:
视图名称
视图名称是用户定义的视图标识符。通过将表与特定视图相关联,可以在 view
表定义中包含属性并提供视图名称作为其参数。例如:
--- UserTable: # Table definition view: UserView UserView: # View definition
字段(字段)
您可以自定义视图,以便它们仅引用所选配置数据中的必要元素。为此,您需要包括fields
属性和一个关联数组,其中包含用户定义的字段名称到 XPath 表达式的映射,这些表达式从配置表项中选择所需的元素。字段名称必须是有效的 Python 变量名称。XPath 表达式相对于表定义中的 or set
属性定义的get
配置作用域。
使用包含 或 get
set
属性的表检索配置数据时,视图中定义的字段标识要从配置中提取的语句。对于包含 set
属性并定义可在设备上配置的资源的表,字段标识可以为该资源配置的语句。您必须为配置资源的所有标识符元素显式定义字段。然后,在相应表定义的属性中 key-field
引用这些标识符字段。
请考虑以下示例配置层次结构:
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>
如果表get
或set
参数将作用域system/login/user
定义为 ,则视图定义中每个字段的 XPath 表达式相对于该上下文。以下视图定义将用户定义的字段名称 username
、 映射到userclass
uid
元素的<user>
子元素:
UserTable: get: system/login/user ... UserView: fields: username: name userclass: class uid: uid
如果表定义包含该set
属性,则必须为唯一标识对象的任何标识符元素显式定义字段,在本例中为 <name>
。Table 的属性key-field
必须引用映射到对象的标识符元素的所有 View 字段。必须始终在表的 set
和 key-field
属性中fields
定义至少一个标识符元素。
然后,在 Python 脚本中,可以将 View 项作为变量属性进行访问。
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get() for account in users: print("Username is {}\nUser class is {}".format(account.name, account.userclass))
检索配置数据时,数据中包含元素的每个对象 <name>
都有一个默认 name
属性,您可以使用该属性访问该元素的值。
视图字段可以包含不同的选项,具体取决于引用该视图的表的类型。定义结构化配置资源的表 (set
) 可以包括对每个字段的类型和约束检查,以确保 Junos PyEZ 应用程序在设备上配置资源时提供有效数据。检索配置数据 (get
) 的表可以包括返回特定元素的属性值或指定要在应用程序中使用的数据类型的选项。 字段选项(“获取”表) 和 字段选项(“设置”表) 分别概述了使用 get
和 set
表时可以包含的选项。
字段选项(“获取”表)
包含 get
属性并仅从设备检索配置数据的表可以为关联视图中的字段定义许多选项或运算符。本节概述了各种选项。
字段格式确定字段值的类型。默认情况下,字段值存储为字符串。可以为字段映射中的值指定不同的类型。下面的示例将元素的值 uid
定义为整数:
UserView: fields: username: name userclass: class uid: { uid : int }
还可以使用以下语法将字段项的值设置为布尔值:
fieldname: { element-name: (True | False)=regex(expression) }
将根据传递给 的 regex()
正则表达式计算元素的值。如果元素的值与表达式匹配,则字段项的值将设置为格式中定义的布尔值。在以下示例中, superuser
如果元素的值 class
包含“超级用户”,则该字段设置为 True:
superuser: { class : True=regex(super-user) }
Junos PyEZ 还为配置视图中的字段提供 group
运算符。通过运算符, group
您可以访问从 Junos 配置组继承的元素的属性值 junos:group
。此值指示从中继承该元素的组。
例如,在以下配置中,remote
用户继承自在层次结构级别配置[edit groups global]
的global
配置群组。
<user junos:group="global"> <name junos:group="global">remote</name> <uid junos:group="global">2000</uid> ... </user>
在字段映射中包含group
运算符以引用属性的值junos:group
而不是元素的值。下面的示例使用group
运算符定义 uidgroup
and fullgroup
字段。在脚本中访问这些字段名称时,该字段将引用与 uid
or full-name
元素关联的属性的值junos:group
。
UserView: groups: auth: authentication fields: username: name userclass: class uid: uid uidgroup: { uid: group } fullgroup: { full-name: group } fields_auth: password: encrypted-password
字段选项(“设置”表)
定义结构化配置资源的set
表可以包括对关联视图中每个字段的类型和约束检查,以确保 Junos PyEZ 应用程序在设备上配置资源时提供有效数据。类型检查可确保 Junos PyEZ 应用程序在为特定资源配置语句时提供正确的数据类型。约束检查使您能够为语句定义默认值,并确保应用程序为这些语句提供在正确范围内的值。本节概述了支持的类型和约束检查,这些检查作为关联视图字段的选项包含在内。
表 2 和 表 3 分别汇总了可以为配置表视图中 set
的字段定义的类型和约束检查。类型检查是互斥的,但可以为每个字段定义多个约束检查。
|
描述 |
例子 |
---|---|---|
|
字段仅接受或的 |
|
|
字段仅接受列表中定义的 |
|
|
字段仅接受浮点值 |
|
|
字段仅接受整数值 |
|
|
字段仅接受字符串值 |
|
约束检查名称 |
描述 |
例子 |
---|---|---|
|
字段的默认值。 当用户未显式配置字段时,字段使用其默认值。如果用户调用该方法 |
|
|
字段的最大值,基于字段 |
|
|
字段的最小值,基于字段 |
|
您只能为字段定义单个类型检查,但可以定义多个约束检查。因此,字段可以包含 default
值、最小值 (minValue
) 和最大值 (maxValue
)。
native_vlan : { 'native-vlan-id' : { 'type' : 'int', 'default' : 501, 'minValue' : 0, 'maxValue' : 4094 } }
minValue
和maxValue
选项根据选项的值type
进行解释。默认情况下,字段值为字符串。对于字符串,minValue
和maxValue
是字符串的最小和最大长度。对于整数和浮点数,这些值是该类型的最小值和最大值。
如果包括字段的类型或约束检查,并且用户提供的配置数据未通过检查,则 Junos PyEZ 应用程序将引发相应的 TypeError
异常, ValueError
并显示一条描述错误的消息。
组(组)和字段组 (fields_)
组提供了一种快捷方式方法,用于选择和引用表项中特定节点集中的元素。
在以下配置数据中,该 <authentication>
元素包含与用户的身份验证方法对应的子元素:
<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>
在 View 定义中,可以通过fields
向相对于所选配置层次结构的每个元素提供完整的 XPath 表达式,使用该属性来访问子元素。例如,如果 Table get
或set
属性在层次结构级别选择<user>
[edit system login]
元素,则字段项映射将使用以下 XPath 表达式:
UserConfigTable: set: system/login/user ... UserConfigView: fields: password: authentication/encrypted-password
或者,您可以创建一个将 XPath 上下文设置为元素的 <authentication>
组,然后定义仅提供相对于该上下文的 XPath 表达式的字段组项。可以在视图定义中定义任意数量的组。
若要创建组,请包含 groups
该属性并将用户定义的组名映射到定义新上下文的 XPath 表达式。然后定义一个字段组,其名称 fields_
后跟组名称。字段组是一个关联数组,其中包含用户定义的字段名称到 XPath 表达式的映射,这些表达式现在相对于 中 groups
设置的上下文。字段名称必须是有效的 Python 变量名称。
下面的示例定义组 auth
和相应的字段组 fields_auth
。该 auth
组将上下文 system/login/user/authentication
设置为层次结构级别, password
字段引用元素的值 encrypted-password
。
UserConfigTable: set: system/login/user ... UserConfigView: groups: auth: authentication fields_auth: password: encrypted-password ...
无论使用字段还是字段组,都可以使用用户定义的字段名称在 Junos PyEZ 脚本中以相同的方式访问值。