加载配置文件
在设备上加载配置文件有助于加载网络中许多设备中可能通用的部分配置文件。
从文件或终端加载配置的示例
您可以创建一个包含瞻博网络设备配置数据的文件,将该文件复制到本地设备,然后将该文件加载到 CLI 中。加载文件后,您可以提交该文件以激活设备上的配置,也可以使用 CLI 以交互方式编辑配置,并在以后提交配置。
您还可以在终端上打字时创建配置,然后加载配置。当您剪切配置的现有部分并将它们粘贴到配置中的其他位置时,从终端加载配置非常有用。
要加载设备上的现有配置文件,请使用 load 配置模式命令:
[edit] user@host# load (factory-default | merge | override | patch | replace | set | update) filename <relative> <json>
要从终端加载配置,请使用以下版本的 load 配置模式命令。按 Ctrl-d 结束输入。
[edit] user@host# load (factory-default | merge | override | patch | replace | set | update) terminal <relative> <json>
要替换整个配置,请在层次结构的任何级别指定该 override 选项。作会将 load override 当前候选配置完全替换为您正在加载的文件。因此,如果保存了完整的配置,则使用此选项。
作将 override 丢弃当前候选配置,并加载配置或 filename 您在终端键入的配置。使用该 override 选项并提交配置时,所有系统进程都会重新解析配置。
要替换配置的某些部分,请指定该 replace 选项。该 load replace 作将查找 replace: 添加到加载文件中的标记。然后,该作将候选配置的这些部分替换为标记后指定的任何部分。当您想要更好地控制正在更改的内容时,这非常有用。要使此作正常工作,您必须在终端键入的文件或配置中包含 replace: 标记。软件将 replace: 搜索标记,删除现有的同名语句(如果有),并用传入配置替换这些语句。如果不存在同名语句,该 replace 作将标有 replace: 标记的语句添加到配置中。
如果在 or作中override指定包含标记的文件replace:或类型文本,则将忽略这些replace:merge标记。在此方案中,override或merge作优先并执行。
如果您正在执行作replace,并且您指定的文件缺少replace:标记,则该replace作将作为作merge运行。replace如果键入replace:的文本缺少标记,该作也会作为作运行merge。如果您正在运行自动化脚本并且无法事先知道脚本是否需要执行replace作或merge作,则此信息可能很有用。脚本可以使用该replace作来涵盖任一情况。
该 load merge 作将保存的文件或终端中的配置与现有候选配置合并。如果要添加新的配置部分,此信息会很有用。例如,假设您要将 BGP 配置 [edit protocols] 添加到之前没有 BGP 配置的层次结构级别。您可以使用该 load merge 作将传入配置与现有候选配置组合在一起。如果现有配置和传入配置包含冲突的语句,则传入配置中的语句将覆盖现有配置中的语句。
要仅替换配置中已更改的部分,请在层次结构的任何级别指定该 update 选项。该 load update 作将比较候选配置和新配置数据。此作仅更改候选配置中与新配置不同的部分。例如,如果存在现有 BGP 配置,并且要加载的文件以某种方式更改了它,则可以使用此作。
merge、 和 override选项update支持以 JavaScript Object Notation (JSON) 格式加载配置数据。加载使用 JSON 格式的配置数据时,必须在命令中指定该json选项。要加载包含无序列表条目的 JSON 配置数据,即列表键不一定是列表条目中第一个元素的列表条目,请参阅加载具有无序列表条目的 JSON 配置数据。
要使用补丁文件更改部分配置,请指定该 patch 选项。该 load patch 作将加载包含配置更改的文件或终端输入。首先,在已进行配置更改的设备上,键入 show | compare 命令以输出两个配置之间的差异。然后,您可以将差异加载到另一台设备上。该 load patch 命令的优点是,它使您不必在将不同层次结构级别的片段加载到目标设备中之前将其复制到文本文件中。如果您要使用相同的选项配置多个设备,这可能会节省一些有用的时间。例如,假设您在路由器 1 上配置了路由策略,并希望在路由器 2、路由器 3 和路由器 4 上复制策略配置。您可以使用该 load patch 作。
在此示例中,您首先运行命令 show | compare 。
示例:
user@router1# show | compare rollback 3
[edit protocols ospf]
+ export default-static;
- export static-default
[edit policy-options]
+ policy-statement default-static {
+ from protocol static;
+ then accept;
+ }
继续此示例,将命令的 show | compare 输出复制到剪贴板,并确保包含层次结构级别。在路由器 2、路由器 3 和路由器 4 上,键入 load patch terminal 并粘贴输出。然后按 Enter 并按 Ctrl-d 结束作。如果补丁输入为现有语句指定了不同的值,则补丁输入将覆盖现有语句。
要在不指定完整层级的情况下使用 merge、 replace、 set或 update 选项,请指定该 relative 选项。此选项相对于配置层次结构中的当前编辑点加载传入配置。
示例:
[edit system]
user@host# show static-host-mapping
bob sysid 987.654.321ab
[edit system]
user@host# load replace terminal relative
[Type ^D at a new line to end input]
replace: static-host-mapping {
bob sysid 0123.456.789bc;
}
load complete
[edit system]
user@host# show static-host-mapping
bob sysid 0123.456.789bc;
要加载包含 set 配置模式命令的配置,请指定该 set 选项。此选项在配置指令存储在文件或终端中时逐行执行它们。这些指令可以包含任何配置模式命令,如 set、 edit、 exit和 top。
要将配置文件从其他网络系统复制到本地路由器,可以使用 SSH 和 Telnet 实用程序,如 CLI 资源管理器中所述。
如果您在通用标准环境中工作,则每当属性发生更改(例如,密码更改或 RADIUS 共享密钥更改)时 secret ,系统都会创建系统日志消息。在以下配置加载作期间将记录这些更改:
load merge load replace load override load update
字符编码在瞻博网络设备上的工作原理
Junos OS 演化版配置数据和作命令输出可能包含 7 位 ASCII 字符集之外的非 ASCII 字符。以特定格式或在特定类型的会话中显示作或配置数据时,软件会对这些字符进行转义和编码。软件使用等效的 UTF-8 十进制字符引用对字符进行转义或编码。
CLI 会尝试在以文本、集合或 JSON 格式生成的配置数据中显示任何非 ASCII 字符。CLI 还尝试在以文本格式生成的命令输出中显示这些字符。在例外情况下,CLI 会改为显示 UTF-8 十进制字符引用。(例外情况包括 XML 格式的配置数据和 XML 或 JSON 格式的命令输出)在 NETCONF 和 Junos XML 协议会话中,如果请求包含非 ASCII 字符的配置数据或命令输出,您会看到类似的结果。在这种情况下,服务器将返回所有格式的这些字符的等效 UTF-8 十进制字符引用。
例如,假设设备上配置了以下用户帐户,其中包含带有波浪号 (ñ) 的拉丁小写字母 n。
[edit] user@host# set system login user mariap class super-user uid 2007 full-name "Maria Peña"
以文本格式显示生成的配置时,CLI 将打印相应的字符。
[edit] user@host# show system login user mariap full-name "Maria Peña"; uid 2007; class super-user;
在 CLI 中以 XML 格式显示生成的配置时,ñ 字符将映射到其等效的 UTF-8 十进制字符引用 ñ。如果在 NETCONF 或 Junos XML 协议会话中以任何格式显示配置,也会产生相同的结果。
[edit]
user@host# show system login user mariap | display xml
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/17.2R1/junos">
<configuration junos:changed-seconds="1494033077" junos:changed-localtime="2017-05-05 18:11:17 PDT">
<system>
<login>
<user>
<name>mariap</name>
<full-name>Maria Peña</full-name>
<uid>2007</uid>
<class>super-user</class>
</user>
</login>
</system>
</configuration>
<cli>
<banner>[edit]</banner>
</cli>
</rpc-reply>
将配置数据加载到设备上时,可以使用非 ASCII 字符的等效 UTF-8 十进制字符引用来加载这些字符。
关于指定语句和标识符
本主题提供有关 CLI 容器语句和叶语句的详细信息,以便您了解如何在创建 ASCII 配置文件时必须指定它们。本主题还介绍了 CLI 如何执行类型检查,以验证您输入的数据格式是否正确。
指定语句
语句以两种方式之一显示,带大括号 ({ }) 或不带括号:
-
语句名称和标识符,用大括号括住一个或多个较低级别的语句:
statement-name1 identifier-name { statement-name2; additional-statements; } -
语句名称、标识符和单个标识符:
statement-name identifier-name1 identifier-name2;
是 statement-name 语句的名称。是 identifier-name 唯一标识语句实例的名称或其他字符串。当可在配置中多次指定语句时,请使用标识符。
指定语句时,必须根据语句层次结构指定语句名称和/或标识符名称。
您可以通过以下方式之一指定标识符:
-
identifier-name—当 identifier-name 语句中可以多次指定语句时,是用于唯一标识语句的关键字。
-
identifier-name value- 是 identifier-name 关键字,是 value 必需选项变量。
-
identifier-name [value1 value2 value3
...]—是 identifier-name 接受多个值的关键字。指定一组值时,括号是必需的;但是,如果仅指定一个值,则它们是可选的。
以下示例说明了如何在配置中指定语句和标识符:
protocol { # Top-level statement (statement-name).
ospf { # Statement under "protocol" (statement-name).
area 0.0.0.0 { # OSPF area "0.0.0.0" (statement-name identifier-name),
interface et-0/0/0 { # which contains an interface named "et-0/0/0."
hello-interval 25; # Identifier and value (identifier-name value).
priority 2; # Identifier and value (identifier-name value).
disable; # Flag identifier (identifier-name).
}
interface et-0/0/1; # Another instance of "interface," named et-0/0/1,
} # this instance contains no data, so no braces
} # are displayed.
}
policy-options { # Top-level statement (statement-name).
term term1 { # Statement under "policy-options"
# (statement-name value).
from { # Statement under "term" (statement-name).
route-filter 10.0.0.0/8 orlonger reject; # One identifier ("route-filter") with
route-filter 127.0.0.0/8 orlonger reject; # multiple values.
route-filter 128.0.0.0/16 orlonger reject;
route-filter 149.20.64.0/24 orlonger reject;
route-filter 172.16.0.0/12 orlonger reject;
route-filter 191.255.0.0/16 orlonger reject;
}
then { # Statement under "term" (statement-name).
next term; # Identifier (identifier-name).
}
}
}
创建 ASCII 配置文件时,需要指定语句和标识符。每个语句都有一个首选样式,CLI 在显示配置以响应配置模式 show 命令时会使用该样式。您可以通过以下方式之一指定语句和标识符:
-
语句后跟标识符:
statement-name identifier-name [...] identifier-name value [...];
-
语句后跟用大括号括起来的标识符:
statement-name { identifier-name; [...] identifier-name value; [...] } -
对于某些重复标识符,可以对所有语句使用一组大括号:
statement-name { identifier-name value1; identifier-name value2; }
执行 CLI 类型检查
指定标识符和值时,CLI 会执行类型检查,以验证您输入的数据格式是否正确。例如,对于必须指定 IP 地址的语句,CLI 要求您输入有效格式的地址。否则,将出现错误消息,指示您需要键入的内容。列出了 CLI 检查的数据类型。以下是 CLI 配置输入类型:
| 数据类型 |
格式 |
示例 |
|---|---|---|
| 物理接口名称(用于 [ |
|
Correct: Incorrect: |
| 完整接口名称 |
|
Correct: Incorrect: |
| 完整或缩写接口名称(用于 [ |
|
Correct: |
| IP 地址 |
|
Correct: Sample translations:
|
| IP 地址(目标前缀)和前缀长度 |
|
Correct: Sample translations:
|
| 国际标准组织 (ISO) 地址 |
|
Correct: Sample translations:
|
| OSPF 区域标识符 (ID) |
|
Correct: Sample translations:
|
关于从文件加载配置
以下示例演示了从文件加载配置的过程。
| 当前配置: interfaces {
Io0 {
unit 0 {
family inet {
address 127.0.0.1;
}
}
}
et-3/0/0 {
unit 0 {
family inet {
address 204.69.248.181/28;
}
}
}
} |
文件内容: interfaces {
replace:
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
} |
load override ------------> |
新内容: interfaces {
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
} |
| 当前配置: interfaces {
Io0 {
unit 0 {
family inet {
address 127.0.0.1;
}
}
}
et-3/0/0 {
unit 0 {
family inet {
address 204.69.248.181/28;
}
}
}
} |
文件内容: interfaces {
replace:
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
} |
load replace ------------> |
新内容: interfaces {
Io0 {
unit 0 {
family inet {
address 127.0.0.1;
}
}
}
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
} |
| 当前配置: interfaces {
Io0 {
unit 0 {
family inet {
address 127.0.0.1;
}
}
}
et-3/0/0 {
unit 0 {
family inet {
address 204.69.248.181/28;
}
}
}
} |
文件内容: interfaces {
replace:
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
} |
load merge ------------> |
新内容: interfaces {
Io0 {
unit 0 {
family inet {
address 127.0.0.1;
}
}
}
et-3/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
address 204.69.248.181/28;
}
}
}
} |
| 当前配置: interfaces {
fxp0 {
unit 0 {
family inet {
address 192.168.6.193/24;
}
}
}
Io0 {
unit 0 {
family inet {
address 127.0.0.1/32;
}
}
}
} |
文件内容: {edit interfaces}
+ et-3/0/0 {
+ unit 0 {
+ family inet {
+ address 10.0.0.1/8;
+ }
+ }
+ } |
load patch ------------> |
新内容: interfaces {
et-0/0/0 {
unit 0 {
family inet {
address 10.0.0.1/8;
}
}
}
fxp0 {
unit 0 {
family inet {
address 192.168.6.193/24;
}
}
}
Io0 {
unit 0 {
family inet {
address 127.0.0.1/32;
}
}
}
} |
上传配置文件
您可以在本地系统上创建配置文件,将文件复制到设备,然后将文件加载到 CLI 中。加载配置文件后,您可以提交该配置文件以激活设备上的配置。您还可以使用 CLI 以交互方式编辑配置,并在以后提交。
要从本地系统上传配置文件:
要在提交配置之前查看配置步骤的结果,请在用户提示时键入 show 命令。
要将这些更改提交到活动配置,请在用户提示时键入命令 commit 。您还可以使用 CLI 以交互方式编辑配置,并在以后提交。
加载包含无序列表条目的 JSON 配置数据
Junos 模式将某些配置对象定义为列表。在 JSON 配置数据中,列表实例被编码为名称/数组对,数组元素是 JSON 对象。通常,JSON 编码列表条目中的成员顺序是任意的,因为 JSON 对象基本上是无序的成员集合。但是,Junos 模式要求列表键位于列表条目中的任何其他同级之前,并按模式指定的顺序显示。
例如, user 层次结构级别的 [edit system login] 对象是一个列表,其中 name 是唯一标识每个用户的列表键。
list user {
key name;
description "Username";
uses login-user-object;
}
在以下示例配置数据中,列表键 (name) 是每个用户的第一个元素。默认情况下,加载 JSON 配置数据时,Junos 设备要求列表键位于列表条目中的任何其他同级之前,并按架构指定的顺序显示。
{
"configuration" : {
"system" : {
"login" : {
"user" : [
{
"name" : "operator",
"class" : "operator",
"uid" : 3001
},
{
"name" : "security-admin",
"class" : "super-user",
"uid" : 3002
}
]
}
}
}
}
Junos 设备提供两个选项来加载包含无序列表条目的 JSON 配置数据,即列表键不一定是第一个元素的列表条目。
-
在设备上加载数据之前,使用
request system convert-json-configuration作模式命令生成带有有序列表条目的 JSON 配置数据。 -
在层
reorder-list-keys次结构级别配置[edit system configuration input format json]该语句。配置语句后,您可以使用无序列表条目加载 JSON 配置数据,并且设备会在加载作期间根据 Junos 架构的要求对列表键重新排序。
配置该 reorder-list-keys 语句时,加载作可能需要更长的时间来解析配置,具体取决于配置的大小和列表的数量。因此,对于大型配置或具有多个列表的配置,建议使用 request system convert-json-configuration 命令而不是 reorder-list-keys 语句。
例如,假设文件 user-data.json 包含以下 JSON 配置。如果尝试加载配置,设备将发出加载错误 admin2 ,因为列表键 name 不是该列表条目中的第一个元素。
user@host> file show /var/tmp/user-data.json
{
"configuration" : {
"system" : {
"login" : {
"user" : [
{
"name" : "admin1",
"class" : "super-user",
"uid" : 3003
},
{
"class" : "super-user",
"name" : "admin2",
"uid" : 3004
}
]
}
}
}
}
如果将上一个文件用作输入的命令,则 request system convert-json-configuration 命令将生成指定的输出文件,其中包含 JSON 配置数据,Junos 设备可以在加载作期间解析这些数据。
user@host> request system convert-json-configuration /var/tmp/user-data.json output-filename user-data-ordered.json
user@host> file show user-data-ordered.json
{
"configuration":{
"system":{
"login":{
"user":[
{
"name":"admin1",
"class":"super-user",
"uid":3003
},
{
"name":"admin2",
"class":"super-user",
"uid":3004
}
]
}
}
}
}
或者,您可以配置 reorder-list-keys 配置语句。
user@host# set system configuration input format json reorder-list-keys user@host# commit
配置语句后,您可以加载包含无序列表条目的原始 JSON 配置文件,设备在解析配置时将处理这些列表条目。
user@host# load merge json /var/tmp/user-data.json load complete