加载配置文件
在设备上加载配置文件有助于加载网络中许多设备通用的配置文件部分。
从文件或终端加载配置的示例
您可以创建包含瞻博网络设备配置数据的文件,将该文件复制到本地设备,然后将该文件加载到 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:
语句添加到配置中。
如果在或操作中override
指定包含标记的文件或键入文本replace:
,则会忽略这些replace:
merge
标记。在这种情况下, override
或 merge
操作优先并被执行。
如果您正在执行某个 replace
操作,并且您指定的文件缺少 replace:
标记,则该操作将 replace
作为操作运行 merge
。replace
如果您键入的文本缺少replace:
标记,该操作也会作为操作运行merge
。如果您正在运行自动脚本,并且无法提前知道脚本需要执行 replace
操作还是 merge
操作,则此信息可能很有用。脚本可以使用该 replace
操作来涵盖任一情况。
该 load merge
操作会将保存的文件或终端中的配置与现有的候选配置合并。如果要添加新的配置节,此信息非常有用。例如,假设您要将 [edit protocols]
BGP 配置添加到之前没有 BGP 配置的层次结构级别。您可以使用该 load merge
操作将传入配置与现有候选配置组合在一起。如果现有配置和传入配置包含冲突的语句,则传入配置中的语句将覆盖现有配置中的语句。
要仅替换配置中已更改的部分,请在层次结构的任何级别指定 update
该选项。该 load update
操作将比较候选配置和新配置数据。此操作仅更改候选配置中与新配置不同的部分。例如,如果存在现有的 BGP 配置,并且您正在加载的文件以某种方式更改了该配置,则可以使用此操作。
merge
、 override
和update
选项支持以 JavaScript 对象表示法 (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>
将配置数据加载到设备上时,可以使用等效的 UTF-8 十进制字符引用来加载非 ASCII 字符。
关于指定语句和标识符
本主题提供有关 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 so-0/0/0 { # which contains an interface named "so-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 so-0/0/1; # Another instance of "interface," named so-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:
|
关于从文件加载配置
以下示例演示了从文件加载配置的过程。
上传配置文件
您可以在本地系统上创建配置文件,将该文件复制到设备,然后将该文件加载到 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
时,load 操作可能需要更长的时间来解析配置,具体取决于配置的大小和列表的数量。因此,对于大型配置或具有许多列表的配置,我们建议使用 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
命令与前一个文件一起使用作为输入,则该命令会生成指定的输出文件,其中包含 Junos 设备可在加载操作期间解析的 JSON 配置数据。
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