使用 Junos PyEZ 配置实用程序配置 Junos 设备
Junos PyEZ 使您能够在 Junos 设备上进行结构化和非结构化配置更改。本主题讨论如何使用该 jnpr.junos.utils.config.Config
实用程序进行非结构化配置更改,其中包括格式化为 ASCII 文本、Junos XML 元素、Junos OS set
命令或 JavaScript 对象表示法 (JSON) 的静态或模板化配置数据。该 Config
实用程序还允许您回滚到先前提交的配置或恢复到救援配置。
配置过程概述
成功连接到 Junos 设备后,要使用实用程序配置 Config
设备,请先创建一个 Config
对象并将其与 Device
实例关联。例如:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
默认情况下,Junos PyEZ 会更新候选全局配置(也称为 共享配置数据库)。进行配置更改的基本过程是锁定配置数据库,加载配置更改,提交配置以使其处于活动状态,然后解锁配置数据库。使用 Junos PyEZ Config
实用程序在共享配置数据库中进行非结构化配置更改时,可以通过调用此处概述的相应实例方法来执行以下操作:
-
使用
lock()
锁定配置 -
通过执行以下操作之一修改配置:
-
加载新的完整配置或修改配置的特定部分时调用
load()
-
调用
rollback()
以恢复到以前提交的配置,如回滚配置中所述
-
-
使用
commit()
提交配置,如提交配置和使用 Junos PyEZ 提交配置中所述 -
使用 解锁配置
unlock()
您还可以使用上下文管理器(with
as
...语法)来创建Config
对象实例,某些配置模式要求您使用上下文管理器。对于这些模式,Junos PyEZ 会自动锁定和解锁配置。有关详细信息,请参阅指定配置模式。
使用 load()
该方法修改配置时,除了指定配置模式外,还可以指定加载操作的类型、配置更改的格式以及配置数据源。该 Config
实用程序支持许多与 Junos CLI 中相同的加载操作和格式。有关详细信息,请参阅:
您可以将配置数据源指定为本地服务器上的文件、目标设备上的文件或可从目标设备访问的 URL 上的文件,或者指定为字符串、XML 对象或 Jinja2 模板。有关指定配置数据源的信息,请参阅以下部分:
指定配置模式
默认情况下,当您创建Config
对象且未显式指定配置模式时,Junos PyEZ 将更新候选全局配置。您还可以指定在修改配置数据库时要使用的其他配置模式。要指定默认模式以外的模式,必须使用上下文管理器创建Config
对象,并将参数设置为mode
所需模式。支持的模式包括 private
、 exclusive
、 dynamic
batch
、 和 ephemeral
。
您可以使用 Junos PyEZ 更新支持此数据库的设备上的 临时配置数据库 。临时数据库是一种备用配置数据库,提供用于在 Junos 设备上执行配置更新的快速编程接口。这是一项高级功能,如果使用不当,可能会对设备的运行产生严重的负面影响。有关更多信息,请参阅 了解临时配置数据库。
当您指定缺省模式以外的模式时,上下文管理器将处理打开和锁定以及关闭和解锁数据库。这可确保您不会无意中使数据库处于锁定状态。在这些情况下,只需调用 load()
和 commit()
方法来配置设备。
例如,以下代码使用该 configure private
模式进行配置更改,该模式将打开候选配置的私有副本:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() with Config(dev, mode='private') as cu: cu.load('set system services netconf traceoptions file test.log', format='set') cu.pdiff() cu.commit() dev.close()
有关不同配置模式的详细信息,请参阅 CLI 用户指南 和使用 Junos PyEZ 配置 Junos 设备。
指定加载操作
Junos PyEZ 支持使用许多与 Junos CLI 中支持的相同加载操作来加载配置更改。通过在方法中包含Config
load()
或省略相应的参数来指定所需的加载操作。
表 1 概述了支持的加载操作和相应的load()
方法参数。默认情况下,Junos PyEZ 会执行一个load replace
操作。若要使用其他加载操作,请在方法中load()
将相应的参数True
设置为。
负载操作 |
参数 |
描述 |
第一个受支持的 Junos PyEZ 版本 |
---|---|---|---|
|
|
将加载的配置与现有配置合并。 |
1.0 |
|
|
将整个配置替换为加载的配置。 |
1.0 |
|
|
从修补程序文件加载配置数据。 |
2.4.0 |
|
– |
将加载的配置与现有配置合并,但将现有配置中的语句替换为在加载的配置中指定 |
1.0 |
|
|
加载完整的配置并将其与现有配置进行比较。加载的配置中不同的每个配置元素都会替换其在现有配置中的相应元素。在提交操作期间,只有受已更改配置元素影响的系统进程才能解析新配置。 |
2.1.0 |
以下示例执行一个 load override
操作,该操作将整个候选配置替换为加载的配置,然后提交候选配置以使其处于活动状态。
from jnpr.junos import Device from jnpr.junos.utils.config import Config config_mx = 'configs/junos-config-mx.conf' dev = Device(host='router1.example.com').open() with Config(dev, mode='exclusive') as cu: cu.load(path=config_mx, overwrite=True) cu.commit() dev.close()
指定要加载的配置数据的格式
Junos PyEZ Config
实用程序允许您使用一种受支持的标准格式来配置 Junos 设备。您可以以字符串、文件、XML 对象或 Jinja2 模板对象的形式提供配置数据。文件可以包含配置数据片段或 Jinja2 模板。在字符串、文件或 Jinja2 模板中提供配置数据时,支持的数据类型格式包括 ASCII 文本、Junos XML 元素、Junos OS set
命令和 JSON。可以通过在实用程序 load()
方法中Config
显式包含format
参数或向配置数据文件添加适当的扩展名来指定配置数据的格式。如果未指定格式,则默认为 XML。
从 Junos PyEZ 1.2 版开始,当您以字符串形式提供配置数据时,Junos PyEZ 会自动检测格式。
表 2 汇总了配置数据支持的格式以及文件扩展名和 format
参数的相应值。对配置数据使用 Junos XML 格式时,必须将数据括在顶级 <configuration>
标记中。
直接在 NETCONF 会话中配置设备时,无需根据需要将格式化为 ASCII 文本、Junos OS set
命令或 JSON 的配置数据括在 <configuration-text>
、 <configuration-set>
或 <configuration-json>
标记中。
配置数据格式 |
文件扩展名 |
格式参数 |
---|---|---|
ASCII 文本 |
.conf、 .text、 .txt |
文本 |
JavaScript Object Notation (JSON) |
。Json |
Json |
Junos OS |
。设置 |
设置 |
Junos XML 元素 |
。Xml |
Xml |
当 or overwrite
update
参数设置为 True
时,不能使用 Junos OS set
命令格式。
运行 Junos OS 16.1R1 或更高版本的设备支持以 JSON 格式加载配置数据。
指定配置数据的位置
Junos PyEZ 允许您将配置数据作为字符串、文件、XML 对象或 Jinja2 模板对象加载。文件可以包含配置数据片段或 Jinja2 模板。
表 3 汇总了 load()
用于传入配置数据或引用其位置的方法参数。必须始终通过在方法调用中包含参数来 format
指定数据的格式,除非使用字符串、XML 对象或具有文件扩展名指示的格式的文件。使用 Jinja2 模板时,请在 template_vars
所需模板变量的字典中包含要传递的参数。
参数 |
配置数据源 |
描述 |
|
---|---|---|---|
|
本地文件 |
本地配置管理服务器上包含格式化为 ASCII 文本、Junos XML 元素、Junos OS |
当文件扩展名不指示数据的格式时,必须包含 |
|
Jinja2 模板对象 |
预加载的 Jinja2 模板对象。 将 |
当文件扩展名不指示数据的格式时,必须包含 |
|
本地 Jinja2 模板文件 |
本地配置管理服务器上包含格式化为 ASCII 文本、Junos XML 元素、Junos OS 将 |
当文件扩展名不指示数据的格式时,必须包含 |
|
远程文件 |
位于 Junos 设备上的文件或可使用 FTP 或超文本传输协议 (HTTP) URL 从 Junos 设备访问的远程 URL 的路径。 |
当文件扩展名不指示数据的格式时,必须包含 |
|
XML 对象 字符串 |
XML 对象或字符串,其中包含格式化为 ASCII 文本、Junos XML 元素、Junos OS |
在这种情况下,Junos PyEZ 会自动检测配置数据的格式,不需要该 |
从本地或远程文件加载配置数据
Junos PyEZ 使您能够从本地或远程文件加载格式化为 ASCII 文本、Junos XML 元素、Junos OS set
命令或 JSON 的配置数据。
若要从配置管理服务器上的本地文件加载配置数据,请将方法的path
参数设置为 load()
文件的绝对或相对路径。例如:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() conf_file = 'configs/junos-config-interfaces.conf' with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit() dev.close()
您还可以从位于 Junos 设备上的文件或可从 Junos 设备访问的 URL 加载配置数据。要从 Junos 设备上的文件加载配置数据,请将参数设置为 url
目标设备上文件的绝对或相对路径,并包括加载操作所需的任何其他参数。例如:
cu.load(url='/var/home/user/golden.conf')
url
设置为远程文件的 FTP 位置或超文本传输协议 (HTTP) URL,并包括加载操作所需的任何其他参数。例如:
cu.load(url='ftp://username@ftp.hostname.net/path/filename')
cu.load(url='http://username:password@example.com/path/filename')
有关指定 URL 的详细信息,请参阅 url
Junos XML 协议 <load-configuration> 操作的属性。
如果文件未使用指定 要加载的配置数据的格式中列出的接受的文件扩展名之一来指示配置数据的格式,则必须通过在方法参数列表中包含 format
参数 load()
来指定格式。例如:
conf_file = 'configs/junos-config-interfaces' cu.load(path=conf_file, format='text', merge=True)
有关从 Jinja2 模板或模板文件加载配置数据的信息,请参阅 使用 Jinja2 模板加载配置数据。
从字符串加载配置数据
要加载格式化为 ASCII 文本、Junos XML 元素、Junos OS set
命令或字符串中的 JSON 的配置数据,请将该字符串作为方法参数列表中的第一个参数 load()
包含在内。Junos PyEZ 会自动检测字符串中配置数据的格式,因此在这种情况下参数 format
是可选的。
以下代码片段提供了示例多行字符串,其中包含不同格式的配置数据和对该方法的 load()
相应调用。为清楚起见,每个示例中都显式包含可选 format
参数。在示例中, cu
是实用程序的一个 Config
实例,它在目标 Junos 设备上运行。
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
对于格式化为 ASCII 文本的配置数据:
config_text = """ system { scripts { op { file test.slax; } } } """
通过将字符串作为列表中的第一个参数提供来加载配置数据,并选择性地指定
format="text"
.cu.load(config_text, format='text', merge=True)
对于格式化为 Junos XML 的配置数据:
config_xml = """ <configuration> <system> <scripts> <op> <file> <name>test.slax</name> </file> </op> </scripts> </system> </configuration> """
通过将字符串作为列表中的第一个参数提供来加载配置数据,并选择性地指定
format="xml"
.cu.load(config_xml, format='xml', merge=True)
对于格式化为 Junos OS
set
命令的配置数据:config_set = """ set system scripts op file test.slax """
通过将字符串作为列表中的第一个参数提供来加载配置数据,并选择性地指定
format="set"
.cu.load(config_set, format='set', merge=True)
对于使用 JSON 格式化的配置数据:
config_json = """{ "configuration" : { "system" : { "scripts" : { "op" : { "file" : [ { "name" : "test.slax" } ] } } } } }"""
通过将字符串作为列表中的第一个参数提供来加载配置数据,并选择性地指定
format="json"
.cu.load(config_json, format='json', merge=True)
加载格式化为 XML 对象的配置数据
要加载格式化为 XML 对象的配置数据,请将该对象作为第一个参数 load()
包含在方法参数列表中,并提供任何其他必需参数。由于配置数据的默认格式为 XML,因此无需在方法调用中显式包含 format
该参数。
下面的代码显示一个 XML 对象和对该方法 load()
的相应调用:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from lxml.builder import E config_xml_obj = ( E.configuration( # create an Element called "configuration" E.system( E.scripts( E.op ( E.file ( E.name("test.slax"), ) ) ) ) ) ) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(config_xml_obj, merge=True) cu.commit()
使用 Jinja2 模板加载配置数据
Junos PyEZ 支持使用 Jinja2 模板渲染 Junos 配置数据。Jinja 是 Python 的模板引擎,使您能够从预定义的模板生成文档。模板是所需语言的文本文件,通过使用表达式和变量提供了灵活性。您可以使用 Jinja2 模板以受支持的配置格式之一创建 Junos 配置数据,其中包括 ASCII 文本、Junos XML 元素、Junos OS set
命令和 JSON。Junos PyEZ 使用 Jinja2 模板和提供的变量字典来呈现配置数据。
Jinja2 模板提供了一种生成配置数据的强大方法,特别是对于类似的配置节。例如,您可以创建一个模板来迭代接口列表并为每个接口创建所需的配置语句,而不是手动为设备上的每个接口添加相同的配置语句。在Jinja中,块由“{%
”和“%}
”分隔,变量括在“{{
”和“}}
”内。
以下示例 Jinja2 模板生成配置数据,用于在逻辑单元 0 上为给定列表中的每个接口启用 MPLS,并根据 MPLS 和 RSVP 协议配置接口。
interfaces { {% for item in interfaces %} {{ item }} { description "{{ description }}"; unit 0 { family {{ family }}; } } {% endfor %} } protocols { mpls { {% for item in interfaces %} interface {{ item }}; {% endfor %} } rsvp { {% for item in interfaces %} interface {{ item }}; {% endfor %} } }
在 Junos PyEZ 代码中,对应的 Jinja2 模板变量字典为:
config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' }
要在 Junos PyEZ 代码中加载 Jinja2 模板,请将参数设置为template_path
模板文件的路径,并将参数设置为template_vars
模板变量的字典。如果不使用接受的文件扩展名之一来指示配置数据的格式,则必须在load()
方法参数列表中包括该format
参数。
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces-mpls.conf' config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' } with Device(host='router1.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(template_path=conf_file, template_vars=config_vars, merge=True) cu.commit()
如果要提供预加载的 Jinja2 模板对象,则必须使用该 template
参数而不是 template_path
方法参数列表中的参数 load()
。
Junos PyEZ 使用 Jinja2 模板和变量字典呈现以下配置数据,然后将其加载到候选配置中并在设备上提交:
interfaces { ge-1/0/1 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/2 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/3 { description "MPLS interface"; unit 0 { family mpls; } } } protocols { mpls { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } rsvp { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } }
以下视频演示了一个简短的 Python 会话,演示了如何使用 Jinja2 模板配置 Junos 设备。
有关 Jinja2 的其他信息,请参阅 https://jinja.pocoo.org/docs/ 中的 Jinja2 文档。
回滚配置
Junos 设备可存储最近提交的配置的副本和最多 49 个先前配置的副本,具体取决于平台。您可以回滚到任何存储的配置。当配置更改导致不良结果,并且您希望恢复到已知的工作配置时,这很有用。回滚配置类似于在设备上进行配置更改的过程,但不是加载配置数据,而是执行回滚,这会将整个候选配置替换为之前提交的配置。
Junos PyEZ jnpr.junos.utils.config.Config
类 rollback()
方法使您能够回滚 Junos 设备上的配置。若要回滚配置,请调用 rollback()
该方法并将参数设置为 rb_id
回滚配置的 ID。有效 ID 值为 0(对于最近提交的配置为零)到比存储的先前配置数(最大值为 49)少 1。如果在方法调用中省略此参数,则默认为 0。
以下示例提示输入要还原的配置的回滚 ID,回滚配置,打印配置差异,然后提交配置以使其成为设备上的活动配置。
from jnpr.junos import Device from jnpr.junos.utils.config import Config rollback_id = int(input('Rollback ID of the configuration to restore: ')) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.rollback(rb_id=rollback_id) cu.pdiff() cu.commit()
user@server:~$ python3 junos-pyez-rollback.py Rollback ID of the configuration to restore: 1 [edit interfaces] - ge-0/0/1 { - unit 0 { - family inet { - address 198.51.100.1/24; - } - } - }
有关包含错误处理的更广泛示例,请参阅 示例:使用 Junos PyEZ 回滚配置。
加载救援配置
救援配置允许您定义已知工作配置或具有已知状态的配置,您可以随时还原。当您需要恢复到已知配置时,或者如果您的路由器或交换机配置和备份配置文件损坏无法修复,则可以使用救援配置。创建救援配置时,设备会将最近提交的配置保存为救援配置。
Junos PyEZ jnpr.junos.utils.config.Config
实用程序可用于管理 Junos 设备上的救援配置。创建类的Config
实例后,可以使用该方法 rescue()
管理救援配置。通过将方法action
参数设置为rescue()
所需的操作,可以指定要对救援配置执行的操作。
要将现有救援配置加载到候选配置中,请指定 action="reload"
。如果不存在救援配置,则加载操作将返回 False
。加载救援配置后,必须提交配置以使其成为设备上的活动配置。
以下示例加载并提交救援配置(如果存在):
from jnpr.junos import Device from jnpr.junos.utils.config import Config with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: rescue = cu.rescue(action='reload') if rescue is False: print ('No existing rescue configuration.') else: cu.pdiff() cu.commit()
有关创建、检索或删除救援配置的信息以及其他示例,请参阅 使用 Junos PyEZ 管理 Junos 设备上的救援配置。
提交配置
修改配置后,必须提交配置以使其成为设备上的活动配置。使用该实用程序在 Config
设备上进行非结构化配置更改时,可以通过调用 commit()
该方法提交候选配置。
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces.conf' with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit()
有关 Junos PyEZ 脚本中提交操作和支持的提交选项的详细信息,请参阅 使用 Junos PyEZ 提交配置。
更改历史记录表
功能支持由您使用的平台和版本决定。使用 功能资源管理器 确定您的平台是否支持某个功能。