使用 Salt 配置运行网络Junos OS
瞻博网络支持使用 Salt 管理运行 Junos OS 的设备,而 Junos 执行和状态模块 (for Salt) 则定义了功能,支持您管理 Junos OS 配置。本主题讨论如何使用 Salt 生成、调配和管理Junos OS配置。
使用 Salt 配置配置Junos OS概述
通过Junos执行和状态模块(适用于 Salt),您可以使用 Salt 管理运行该策略Junos OS。这些模块定义了执行以下任务的功能:
锁定并解锁配置数据库
负载配置数据
提交配置
回滚配置
配置设备主机名并提交更改
表 1 列出了可用于管理配置的功能,并简要说明每种功能。您可以使用执行功能在 Salt 主命令行上执行操作。但通常,您将定义受管理设备必须的状态,并使用状态功能应用配置。
Junos执行功能 |
Junos状态功能 |
描述 |
---|---|---|
将加载的更改提交到目标配置数据库中。 |
||
对 |
||
锁定、修改、提交和解锁目标配置数据库。 |
||
将指定文件中的配置数据加载到目标配置数据库中。 |
||
请求候选配置上的专用锁。 |
||
将配置回滚到之前提交的配置,然后提交。 |
||
配置运行 Junos OS 的托管设备的主机Junos OS提交更改。 |
||
释放候选配置上的排他锁。 |
执行配置更改的基本流程是锁定配置数据库、加载配置更改、提交配置以将其处于活动状态,然后解除配置数据库锁定。您可以使用相应的函数单独执行每个操作,或使用 函数执行所有操作(使用单个 junos.install_config
功能调用)。
默认情况下,该功能使用模式对候选配置数据库进行更改,模式将自动 junos.install_config
configure exclusive
锁定并解锁配置数据库。该功能会将已加载的配置与当前配置进行比较,并且仅在有更改时应用新配置。如果功能修改配置,则执行 commit check
和 commit
操作。
建议使用 函数 junos.install_config
进行配置更改,因为它可处理整个配置工作流程。该功能还允许您将配置差异保存到文件中,并使用不同的配置模式。例如,您可以使用模式修改候选配置的专用副本,如"如何指定配置模式 configure private
"中所述。
使用 或 功能加载新 junos.load
配置 junos.install_config
数据时,您可以指定负载操作以及更改的来源和格式。
负载操作 — 负载操作决定如何将配置数据加载到候选配置中。这些功能支持该系列中提供的许多相同负载操作,Junos OS CLI,包括合并、覆盖、替换和更新。有关详细信息,请参阅 如何指定负载操作。
格式 — 您可使用标准Junos OS支持的格式之一来配置运行网络的设备。您可以提供配置数据或 Jinja2 模板作为文本、Junos XML 元素、Junos OS命令或
set
JSON。有关详细信息,请参阅 如何指定要加载的配置数据的格式。配置数据源 - 您可从包含部分或完整配置或 Jinja2 模板的文件加载配置数据。有关详细信息,请参阅 如何使用 Jinja2 模板加载配置数据以及如何 加载配置数据。
修改配置后,您必须提交配置,使其成为设备上的活动配置。 junos.install_config
、 junos.rollback
和 junos.set_hostname
功能会自动将更改提交到配置。您也可执行 junos.commit
函数以执行提交操作。有关不同功能的行为及其支持的提交选项的信息,请参阅 如何提交配置。
除了加载新配置数据之外,您还可以使用 该功能 junos.rollback
将配置回滚到之前提交的配置。该功能会自动提交更新的配置。有关详细信息,请参阅 如何回滚配置。
如何锁定和解锁配置数据库
在修改候选配置之前,您可以先锁定候选配置,以防止其他用户或应用程序更新该配置,直到锁定释放。这相当于命令 configure exclusive
在命令CLI。我们建议您在进行更改之前锁定配置,尤其是在授权多个用户更改配置的设备上,因为提交操作适用于候选配置中所有更改,而不仅是请求提交的用户或应用程序所做的更改。
该功能使用模式对候选配置数据库进行更改,模式将自动锁定配置数据库,加载并提交 junos.install_config
configure exclusive
更改,然后解锁数据库。但是,如果您需要单独执行加载和提交操作,例如,使用 和 功能,您可以使用 和 执行或状态函数显式锁定和解锁 junos.load
junos.commit
junos.lock
junos.unlock
数据库。
要修改配置数据库之前显式锁定它,请使用 junos.lock
函数。例如:
saltuser@salt-master:~$ sudo salt 'router1' junos.lock router1: ---------- message: Successfully locked the configuration. out: True
要解除数据库锁定并丢弃任何未提交更改,请使用 junos.unlock
该功能。例如:
saltuser@salt-master:~$ sudo salt 'router1' junos.unlock router1: ---------- message: Successfully unlocked the configuration. out: True
如果配置数据库已修改,或者另一位用户已拥有排他锁,则函数将返回一条消息, junos.lock
LockError
如以下示例中所示:
saltuser@salt-master:~$ sudo salt 'router1' junos.lock router1: ---------- message: Could not gain lock due to : "LockError(severity: error, bad_element: None, message: configuration database modified)" out: False
saltuser@salt-master:~$ sudo salt 'router1' junos.lock router1: ---------- message: Could not gain lock due to : "LockError(severity: error, bad_element: None, message: configuration database locked by: admin terminal p1 (pid 28508) on since 2019-08-12 12:46:52 PDT exclusive [edit])" out: False
如何指定配置模式
junos.install_config
该功能允许您在不同的配置模式下进行更改。默认情况下,该功能使用模式对候选配置数据库 configure exclusive
进行更改。模式将锁定候选全局配置(也称为共享配置数据库),只要功能需要对配置执行请求 configure exclusive
的配置更改。 锁定数据库可以防止其他用户修改或提交对数据库的更改,直到锁释放。
要指定不同模式,请 mode
设置与所需模式相同的参数。支持的模式包括 batch
、 、 和 dynamic
ephemeral
exclusive
private
。有关不同模式的信息,请参阅 CLI User Guide。
例如,以下命令使用模式对配置进行更改,模式将打开候选配置的 configure private
专用副本:
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config 'salt://configs/mpls-config.set' mode=private router1: ---------- message: Successfully loaded and committed! out: True
同样,您可以在 Salt 状态文件中包括该参数。
saltuser@salt-master:~$ cat /srv/salt/junos_mpls_config.sls Install MPLS Config: junos.install_config: - name: salt://configs/mpls-config.set - mode: private
您还可以使用 该功能在支持此数据库的设备上更新 junos.install_config
临时配置数据库。临时数据库是备用配置数据库,提供快速编程接口,在运行新设备的设备上执行配置Junos OS。您必须使用 Salt 版本 3001 和 Junos PyEZ 2.1.3 或更高版本,
临时配置数据库是一项高级功能,如果使用不正确,对设备的操作有严重负面影响。有关详细信息,请参阅 了解临时配置数据库。
要配置临时配置数据库的默认实例,请将 mode
参数设置为 ephemeral
等于 。例如:
saltuser@salt-master:~$ cat /srv/salt/junos_ephemeral_config.sls Install MPLS config in default ephemeral instance: junos.install_config: - name: salt://configs/mpls-ephemeral-config.set - mode: ephemeral
要配置临时配置数据库的用户定义实例,请将参数设置为 等于 ,并设置与实例名称 mode
ephemeral
ephemeral_instance
相等的参数。
saltuser@salt-master:~$ cat /srv/salt/junos_ephemeral_instance_config.sls Install MPLS config in ephemeral instance: junos.install_config: - name: salt://configs/mpls-ephemeral-instance-config.set - mode: ephemeral - ephemeral_instance: eph1
如何指定负载操作
您可以使用 和 junos.load
junos.install_config
功能来加载配置更改(使用 load merge
、 load replace
、 或 load override
load update
操作)。通过包括或省略该函数相应的参数,可指定所需的负载操作。如果未指定负载操作,则默认为 load replace
。 表 2 汇总了每种负载操作类型所需的参数。
负载操作 |
功能参数 |
描述 |
---|---|---|
|
|
将加载的配置与现有配置合并。 |
|
|
将整个配置更换为已加载的配置。 |
|
– |
将已加载的配置与现有配置合并,但将现有配置中的语句替换为在已加载配置中指定 |
|
|
将完整加载的配置与现有配置进行比较。已加载配置中不同的每个配置元素将替换其现有配置中的相应元素。在提交操作期间,只有受更改的配置元素影响的系统进程才能解析新配置。 |
以下命令将目标设备上整个配置替换为指定配置,然后提交。RPC 超时时间增加,以提供足够的时间来加载和提交完整配置。
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config overwrite=True 'salt://configs/junos-complete-config.conf' dev_timeout=60
等效状态文件是:
Replace complete configuration: junos.install_config: - name: salt://configs/junos-complete-config.conf - overwrite: True - dev_timeout: 60
如何指定要加载的配置数据的格式
和 junos.load
junos.install_config
功能使您能够使用一种标准Junos OS支持的格式配置运行网络的设备。您可从包含部分或完整配置或 Jinja2 模板的文件加载配置数据。这些数据可以文本、xml 元素Junos命令或 set
JSON Junos OS提供。
必须通过向配置文件添加相应的扩展或明确包含函数调用中的参数来指定配置数据 format
的格式。 表 3 汇总了配置数据支持的格式以及文件扩展名和参数的相应 format
值。如果包括该 format
参数,它将覆盖文件扩展名指示的格式。
配置数据格式 |
文件扩展名 |
格式参数 |
---|---|---|
CLI配置语句(文本) |
.conf |
|
JavaScript 对象表示法 (JSON) |
.json |
|
Junos OS |
.set |
|
Junos XML 元素 |
.xml |
|
运行新Junos OS的设备支持以 JSON 格式加载配置数据(从 Junos OS 版16.1R1。
如何加载配置数据
通过 和 功能,您能够从包含部分或完整配置或 junos.load
junos.install_config
Jinja2 模板的文件加载配置数据。该文件可驻留在 Salt 主服务器或代理 minion 服务器上。函数必须使用 salt://表示法在 Salt master 上指定路径,并且必须使用绝对路径在代理 minion 服务器上指定路径。如果文件不使用接受的文件扩展名之一来指示配置数据的格式,则函数调用还必须包含参数以指定 format
数据格式。
表 4 说明了您可以使用的配置数据源,并列出了指定文件位置所需的执行和状态功能参数。执行功能可以使用关键字将路径指定为位置参数 path
。
配置数据源 |
描述 |
位置 |
执行功能参数 |
状态功能参数 |
---|---|---|---|---|
配置数据文件 |
包含格式化为 ASCII 文本、Junos XML 元素、Junos OS命令或 JSON 的配置 |
Salt master — 使用 salt:// 表示法 代理 minion 服务器 — 使用绝对路径 |
|
|
Jinja2 模板文件 |
包含格式为 ASCII 文本、Junos XML 元素、Junos OS或 JSON 的 Jinja2 模板 在函数调用中包括参数,提供在 Salt 系统中尚未定义的任何所需 Jinja2 模板变量的词汇表,例如作为支柱 |
Salt master — 使用 salt:// 表示法 代理 minion 服务器 — 使用绝对路径 |
|
|
例如,以下文件包含配置Junos OS set
操作脚本的一些命令。文件的扩展名指示配置数据的格式。
saltuser@salt-master:~$ cat /srv/salt/configs/op-scripts.set set system scripts op file bgp.slax set system scripts op file ospf.slax
以下 Salt 命令使用 junos.install_config
执行功能在目标设备上加载和提交配置。该路径作为位置参数提供。
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config 'salt://configs/op-scripts.set' router1: ---------- message: Successfully loaded and committed! out: True
等效状态文件是:
saltuser@salt-master:~$ cat /srv/salt/junos-config-op-scripts.sls Installing op scripts: junos.install_config: - name: salt://configs/op-scripts.set - comment: committed using Salt
saltuser@salt-master:~$ sudo salt 'router1' state.apply junos-config-op-scripts router1: ---------- ID: Installing op scripts Function: junos.install_config Name: salt://configs/op-scripts.set Result: True Comment: Started: 04:19:59.819155 Duration: 14853.384 ms Changes: ---------- message: Successfully loaded and committed! out: True Summary for router1 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 14.853 s
junos.install_config
该功能会自动在候选配置和请求的配置之间执行差异。该功能仅适用于在发生变化时应用配置。如果再次尝试应用同一配置,该功能将返回一条消息,说明配置已应用,不会加载并再次提交, junos.install_config
如以下示例中所示:
saltuser@salt-master:~$ sudo salt 'router1' state.apply junos-config-op-scripts router1: ---------- ID: Installing op scripts Function: junos.install_config Name: salt://configs/op-scripts.set Result: True Comment: Started: 06:01:52.365353 Duration: 778.843 ms Changes: ---------- message: Configuration already applied! out: True Summary for router1 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 778.843 ms
如何使用 Jinja2 模板加载配置数据
使用 junos.load
junos.install_config
Jinja2 模板支持配置数据的执行Junos OS状态功能。Jinja 是 Python 的模板引擎,可让您从预定义的模板生成文档。模板是所需语言中的文本文件,通过使用表达式和变量提供了灵活性。您可以使用 Jinja2 Junos OS支持的配置格式之一创建多种配置数据,这些配置格式包括 ASCII 文本、Junos XML 元素、Junos OS 命令和 set
JSON。函数使用 Jinja2 模板和提供的变量库来呈现配置数据。
Jinja2 模板提供了一种强大的方法来生成配置数据,特别是对于类似的配置部分。例如,您不需要为设备上每个接口手动添加相同的配置语句,而是可以创建一个在接口列表上进行编程并为每个接口创建所需配置语句的模板。在 Jinja 中,块用 " 和 " 分隔,变量则 {%
%}
包括在 " 和 {{
" }}
中。
要加载 Jinja2 模板,您必须在 或 函数调用中包括 junos.load
junos.install_config
以下参数:
模板路径 — 指定 Salt master 或代理 minion 服务器上模板文件的路径,如"如何加载配置 数据"中所述。
模板格式 — 如果模板文件不使用其中一个接受的文件扩展名来指定格式,则设置 参数以
format
指示配置数据的格式。有关指定格式的信息,请参阅 如何指定要加载的配置数据的格式。模板变量 — 该模板可参考 Salt 内部变量,如在支柱或粒度数据中定义的变量。在参数中必须提供未在 Salt 系统内定义的任何
template_vars
变量。该值template_vars
是呈现 Jinja2 模板所需的密钥和值库。注意:如果您的模板仅包含 Salt 内部变量,如支柱数据、粒度数据和函数,则可能需要定义该函数才能
junos.install_config
template_vars: True
呈现该模板。
以下示例 Jinja2 模板可生成配置数据,为给定列表中的每个接口在逻辑单元 0 上启用 MPLS,并配置 MPLS 和 RSVP 协议下的接口。
saltuser@salt-master:~$ cat /srv/salt/configs/junos-config-mpls-jinja2-template.conf interfaces { {% for item in template_vars['interfaces'] %} {{ item }} { description "{{ template_vars['description'] }}"; unit 0 { family {{ template_vars['family'] }}; } } {% endfor %} } protocols { mpls { {% for item in template_vars['interfaces'] %} interface {{ item }}; {% endfor %} } rsvp { {% for item in template_vars['interfaces'] %} interface {{ item }}; {% endfor %} } }
以下命令使用 Jinja2 模板和 中定义的变量呈现配置数据,然后加载并提交在目标 template_vars
主机上:
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config 'salt://configs/junos-config-mpls-jinja2-template.conf' template_vars='{ "interfaces" : ["ge-1/0/1", "ge-1/0/2", "ge-1/0/3"], "description" : "MPLS interface", "family" : "mpls" }' router1: ---------- message: Successfully loaded and committed! out: True
以下状态文件将加载相同的配置。配置差异存储在代理 diffs_file
minion 服务器上文件中。
saltuser@salt-master:~$ cat /srv/salt/junos_install_config_mpls.sls Install Junos OS config: junos.install_config: - name: 'salt://configs/junos-config-mpls-jinja2-template.conf' - comment: committed using Salt - diffs_file: /home/saltuser/junos-config-mpls-diff - template_vars: interfaces: ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'] description: MPLS interface family: mpls
应用状态时,Salt 将呈现配置并加载,然后设备上提交配置。
saltuser@salt-master:~$ sudo salt 'router1' state.apply junos_install_config_mpls router1: ---------- ID: Install Junos OS config Function: junos.install_config Name: salt://configs/junos-config-mpls-jinja2-template.conf Result: True Comment: Started: 05:28:51.575045 Duration: 23675.957 ms Changes: ---------- message: Successfully loaded and committed! out: True Summary for router1 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 23.676 s
该功能将生成以下配置数据,此数据将加载到设备的候选配置中并提交:
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.0; interface ge-1/0/2.0; interface ge-1/0/3.0; } rsvp { interface ge-1/0/1.0; interface ge-1/0/2.0; interface ge-1/0/3.0; } }
如何提交配置
修改配置后,您必须提交配置,使其成为设备上的活动配置。 junos.install_config
、 junos.rollback
和 junos.set_hostname
函数加载请求的配置更改,然后自动执行提交检查和提交操作。您还可以使用 单个 和 函数执行提交检查和提交操作,例如,使用 函数 junos.commit_check
junos.commit
junos.load
更新配置之后。
该Junos OS CLI提供了提交操作选项,例如添加提交注释或同步多个路由引擎上的配置。执行和状态模块功能支持Junos选项。 表 5 概括显示了可用的提交选项以及支持这些选项的功能。支持的参数对于执行功能和状态函数均有效。
功能参数 |
描述 |
支持论据的功能 |
CLI命令等效项 |
---|---|---|---|
|
在系统日志文件以及设备的提交历史记录中记录该提交操作的评论。 |
|
|
|
要求在初始提交后指定的时间内确认提交操作。否则,请回滚到之前提交的配置。 将参数设置为 |
|
|
|
返回有关提交流程的详细信息。 |
|
|
|
等待使用指定值作为超时完成操作。 |
|
– |
|
同步并提交这两个路由引擎上的配置,即使另一个路由引擎上存在开放式配置会话或未提交配置更改路由引擎。 |
|
|
|
在两个路由引擎上同步并提交配置。 |
|
|
提交评论
提交配置时,您可以添加一个简短的注释,用来描述提交更改的目的。要记录描述更改的注释,请包括 comment
参数和消息字符串。例如:
saltuser@salt-master:~$ sudo salt 'router1' junos.commit comment='Committed using Salt'
同样,在状态文件中:
saltuser@salt-master:~$ cat /srv/salt/junos_install_mx_config.sls Install Junos OS config: junos.install_config: - name: salt://configs/mx-config-common.set - comment: Committed using Salt
提交注释包含在提交的系统日志消息中,并记录在提交历史记录中。
saltuser@salt-master:~$ sudo salt 'router1' junos.cli 'show system commit' router1: ---------- message: 0 2019-08-05 15:08:01 PDT by saltuser via netconf Committed using Salt ... out: True
提交已确认
提交候选配置时,需要明确确认提交将变得永久。如果提交时间未在指定的时间内确认,设备将自动加载并提交(回滚至)先前提交的配置。确认的提交操作有助于验证配置更改是否正常工作,并且不会阻止对设备的管理访问。如果更改阻止访问或导致其他错误,则自动回滚到上一配置在回滚最后期限后将恢复对设备的访问。
要要求在初始提交后指定的时间内确认提交操作,请包括 confirm=minutes
该参数。允许的范围是 1 到 65,535 分钟。您还可以指定使用 confirm=True
10 分钟的默认时间。
以下命令要求在 15 分钟内确认提交:
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config 'salt://configs/mx-config-common.set' confirm=15 router1: ---------- message: Successfully loaded and committed! out: True
要确认提交操作,请致电 或 junos.commit
junos.commit_check
功能。
saltuser@salt-master:~$ sudo salt 'router1' junos.commit comment='Confirming commit using Salt' router1: ---------- message: Commit Successful. out: True
提交详细信息
使用 函数提交配置时,可以通过包含参数来查看整个提交 junos.commit
操作 detail=True
的详细信息。当包含此参数时,函数将返回有关提交流程的详细信息。
saltuser@salt-master:~$ sudo salt 'router1' junos.commit detail=True router1: ---------- message: ---------- routing-engine: ---------- name: re0 progress-indicator: |_ ---------- message: Obtaining lock for commit timestamp: 2019-08-14 11:17:50 PDT |_ ---------- message: updating commit revision timestamp: 2019-08-14 11:17:50 PDT ...
提交同步
使用函数提交配置时,可以通过包含参数在双路由引擎路由引擎 junos.commit
和 sync=True
提交配置。例如:
saltuser@salt-master:~$ sudo salt 'router1' junos.commit sync=True
包括参数时,设备将本地 路由引擎 上存储的候选配置复制到另一个 路由引擎,验证报考者语法正确性,然后两个路由引擎上提交。 sync=True
要强制操作成功,即使另一个会话上存在开放式配置会话或未提交配置更改 commit synchronize
,路由引擎使用 force_sync=True
参数。包括此参数会导致设备在同步和提交配置之前终止路由引擎另一个会话上的配置会话。
提交超时
RPC 的退出默认时间为 30 秒。较大的配置更改可能超过此值,从而导致操作在上传和提交配置之前的时间超过。要适应可能需要超过默认超时间隔的提交时间的配置更改,请包括该参数,将超时间隔设置为 dev_timeout=seconds
相应的值。例如:
saltuser@salt-master:~$ sudo salt 'router1' junos.install_config 'salt://configs/junos_mx_config.conf' dev_timeout=60
saltuser@salt-master:~$ cat /srv/salt/junos_install_mx_config.sls Install Config: junos.install_config: - name: salt://configs/junos_mx_config.conf - dev_timeout: 60
如何回滚配置
运行 Junos OS的设备会存储最近提交的配置和最多 49 个先前配置的副本,具体取决于平台。您可以将回滚到任何存储的配置。如果配置更改导致不必要的结果,并且您想要恢复到已知工作配置,则这会非常有用。回滚配置的过程类似于在设备上执行配置更改的过程,但执行回滚操作(而不是加载配置数据)将替换整个候选配置,而将整个候选配置替换为先前提交的配置。
执行功能和状态功能使您能够将配置回滚到之前在运行新设备的配置 salt.modules.junos.rollback
salt.states.junos.rollback
Junos OS。要回滚配置并提交配置,请执行函数,将参数设置为 id
所需回滚配置的 ID。有效 ID 值是最近提交配置的 0(零),其数量比之前存储的配置数少一个(最大值为 49)。如果省略 id
该关键字,该关键字将默认为 0。
例如,以下命令将配置回滚至之前提交的配置,然后提交:
saltuser@salt-master:~$ sudo salt 'router1' junos.rollback id=1 comment='Rolling back configuration using Salt' router1: ---------- message: Rollback successful out: True
要回滚配置并记录文件中的配置差异,稍后参考,包括该参数,并设置为代理 minion 服务器上编写差异的文件 diffs_file
的路径。
saltuser@salt-master:~$ sudo salt 'router1' junos.rollback id=1 comment='Rolling back configuration using Salt' diffs_file='/home/saltuser/router1-rollback-diff' router1: ---------- message: Rollback successful out: True
差异保存在代理 minion 服务器上指定的文件中。
saltuser@minion:~$ cat /home/saltuser/router1-rollback-diff [edit system scripts op] - file bgp-neighbors.slax;