使用 Salt 配置运行 Junos OS 的设备
瞻博网络支持使用 Salt 管理运行 Junos OS 的设备,而 Junos 执行和状态模块(适用于 Salt)可定义用于管理 Junos OS 配置的函数。本主题讨论如何使用 Salt 生成、调配和管理 Junos OS 配置。
使用 Salt 调配 Junos OS 配置概述
Junos 执行和状态模块(用于 Salt)使您能够使用 Salt 管理运行 Junos OS 的设备的配置。模块定义用于执行以下任务的函数:
锁定和解锁配置数据库
加载配置数据
提交配置
回滚配置
配置设备主机名并提交更改
表 1 列出了可用于管理配置的功能,并提供了每个功能的简要说明。您可以使用执行函数在 Salt master 命令行上执行作。但更常见的是,您将定义受管设备必须处于的状态,并使用状态函数来应用配置。
Junos 执行函数 |
Junos 状态函数 |
描述 |
|---|---|---|
提交加载到目标配置数据库中的更改。 |
||
对候选配置执行 |
||
锁定、修改、提交和解锁目标配置数据库。 |
||
将指定文件中的配置数据加载到目标配置数据库中。 |
||
请求对候选配置进行独占锁定。 |
||
将配置回滚到之前提交的配置并提交。 |
||
配置运行 Junos OS 的受管设备的主机名并提交更改。 |
||
释放候选配置上的独占锁定。 |
进行配置更改的基本过程是锁定配置数据库,加载配置更改,提交配置以使其处于活动状态,然后解锁配置数据库。您可以使用相应的函数单独执行每个作,也可以使用该 junos.install_config 函数通过单个函数调用执行所有作。
默认情况下,该junos.install_config函数使用configure exclusive模式对候选配置数据库进行更改,这会自动锁定和解锁配置数据库。该函数将加载的配置与当前配置进行比较,并且仅在发生更改时才应用新配置。如果该函数修改了配置,它将执行和commit checkcommit作。
建议使用该 junos.install_config 函数进行配置更改,因为它会处理整个配置工作流。该函数还允许您将配置差异保存到文件中并使用不同的配置模式。例如,您可以使用 configure private 模式修改候选配置的专用副本,如 如何指定配置模式中所述。
使用 junos.load 或 junos.install_config 函数加载新的配置数据时,可以指定加载作以及更改的来源和格式。
加载作 — 加载作确定如何将配置数据加载到候选配置中。这些函数支持许多与 Junos OS CLI 中相同的加载作,包括合并、覆盖、替换和更新。有关详细信息,请参阅 如何指定加载作。
格式 - 您可以使用支持的标准格式之一配置运行 Junos OS 的设备。您可以以文本、Junos XML 元素、Junos OS 命令或 JSON 的形式提供配置数据或 Jinja2
set模板。有关更多信息,请参阅 如何指定要加载的配置数据的格式。配置数据源 - 您可以从包含部分或完整配置的文件或 Jinja2 模板加载配置数据。有关详细信息,请参阅 如何加载配置数据 和 如何使用 Jinja2 模板加载配置数据。
修改配置后,您必须提交配置,使其成为设备上的活动配置。、 junos.install_configjunos.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、 ephemeralexclusive和 private。有关不同模式的信息,请参阅 CLI 用户指南。
例如,以下命令使用 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 replaceload override、load merge或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 模板加载配置数据。数据可以文本、Junos XML 元素、Junos OS set 命令或 JSON 形式提供。
必须通过向配置文件添加适当的扩展名或通过在函数调用中显式包含 format 参数来指定配置数据的格式。 表 3 汇总了配置数据支持的格式以及文件扩展名和 format 参数的相应值。如果包含该 format 参数,它将覆盖文件扩展名指示的格式。
配置数据格式 |
文件扩展名 |
format 参数 |
|---|---|---|
CLI 配置语句(文本) |
.conf 文件 |
|
JavaScript 对象标记 (JSON) |
.json |
|
|
。设置 |
|
Junos XML 元素 |
.xml |
|
从 Junos OS 16.1R1 版开始,运行 Junos OS 的设备支持以 JSON 格式加载配置数据。
如何加载配置数据
junos.load和 junos.install_config 函数允许您从包含部分或完整配置的文件或 Jinja2 模板中加载配置数据。该文件可以驻留在 Salt 主服务器或代理工作节点服务器上。这些函数必须使用 salt:// 表示法来指定 Salt 主服务器上的路径,并且必须使用绝对路径来指定代理工作节点服务器上的路径。如果文件未使用接受的文件扩展名之一来指示配置数据的格式,则函数调用还必须包含format用于指定数据格式的参数。
表 4 介绍了可以使用的配置数据源,并列出了指定文件位置所需的执行和状态函数参数。执行函数可以将路径指定为位置参数或使用 path 关键字。
配置数据源 |
描述 |
位置 |
执行函数参数 |
状态函数参数 |
|---|---|---|---|---|
配置数据文件 |
包含格式为 ASCII 文本、Junos XML 元素、Junos OS |
Salt Master - 使用 salt:// 表示法 代理工作节点服务器 - 使用绝对路径 |
|
|
Jinja2 模板文件 |
包含格式为 ASCII 文本、Junos XML 元素、Junos OS 在函数调用中包含该 |
Salt Master - 使用 salt:// 表示法 代理工作节点服务器 - 使用绝对路径 |
|
|
例如,以下文件包含用于配置两个作脚本的 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 模板,您必须在 or junos.install_config 函数调用中junos.load包含以下参数:
模板路径 - 指定 Salt 主服务器或代理工作节点服务器上模板文件的路径,如 如何加载配置数据中所述。
模板格式 - 如果模板文件未使用接受的文件扩展名之一来指定格式,则设置
format参数以指示配置数据的格式。有关指定格式的信息,请参阅 如何指定要加载的配置数据的格式。模板变量 - 模板可以引用 Salt 内部变量,如支柱或谷物数据中定义的变量。必须在参数中
template_vars提供任何尚未在 Salt 系统中定义的变量。该template_vars值是呈现 Jinja2 模板所需的键和值的字典。注意:如果模板仅包含 Salt 内部变量(如柱数据、粒度数据和函数),则可能需要定义
template_vars: True函数junos.install_config才能呈现模板。
以下示例 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 代理工作节点服务器上的文件中。
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.set_hostname 函数加载请求的配置更改,junos.rollback然后自动执行提交检查和提交作。您还可以使用 individual junos.commit_check 和 junos.commit functions 来执行提交检查和提交作,例如,在使用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(零),比之前存储的配置数少 1(最大值为 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
要回滚配置并将配置差异记录在文件中以供以后参考,请包含该 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
差异将保存到代理工作节点服务器上的指定文件中。
saltuser@minion:~$ cat /home/saltuser/router1-rollback-diff [edit system scripts op] - file bgp-neighbors.slax;