将Junos OS语句映射到 JSON
运行 Junos OS 的配置作为语句的层次结构存储。配置语句层次结构包含两种类型的语句:
容器语句— 包含其他语句的语句
叶语句— 不包含其他语句的语句
所有容器和叶语句共同构成 配置层次结构。
除了格式化的 ASCII 文本、Junos XML 元素和配置模式命令之外,还可以使用 JavaScript Object Notation (JSON) 表示配置 set 层次结构。从 Junos OS 14.2 版开始,您可以通过在 CLI 中执行 命令来查看以 JSON 格式运行 Junos OS show configuration | display json 设备的CLI。此外,从 Junos OS 16.1 版开始,您可以在设备上加载 JSON 格式的配置数据。
从 16.1 Junos OS开始,运行 Junos OS 的设备会使用新的序列化默认实施来发出 JSON 格式的配置数据。您可以通过在 层次结构级别配置相应的语句来显式配置 新的 默认值 , 或 恢复到 ietf verbose 之前的 [edit system export-format json] 默认设置。您可以配置从 Junos OS版本16.1R1语句,即使该语句Junos OS CLI到 verbose 更高版本。
从 Junos OS 版16.1R4、16.2R2 和 17.1R1 版开始,JSON 格式发出的 Junos OS 配置数据的整数不会用引号括住。在早期版本中,JSON 配置数据中的整数被视为字符串,并括在引号中。
以下部分介绍格式的 ASCII 文本与用于 JSON 中的配置语句Junos OS格式之间的映射:
层次结构级别和容器语句的映射
Junos OS 配置层次结构由具有单个顶级成员或名称/值对的 JSON 对象表示,JSON 对象将字段名称设置为 ,值中包含代表整个配置的 JSON 对象。 "configuration"configuration成员与配置 [edit] 模式下的层次结构CLI对应。在配置层次结构的下几个级别中,大多数语句都是容器语句。
在 JSON 中,每个Junos OS层次结构级别或容器语句都是其父对象的成员。成员或名称/值对有一个字段名称对应于层次结构或容器的名称。其值是一个 JSON 对象,包含代表子容器和该层级的叶语句的成员。对象还可以包含一个成员,其中包含与该层次结构相关联的属性列表(如果有)。
以下示例显示配置层次结构顶层两个语句的格式化 ASCII 文本和 JSON 之间的映射:
CLI配置语句
system {
login {
...child statements...
}
}
protocols {
ospf {
...child statements...
}
}
JSON 语法
{
"configuration" : {
"system" : {
"login" : {
...JSON configuration data...
}
}
"protocols" : {
"ospf" : {
...JSON configuration data...
}
}
}
}
映射具有标识符的对象
在某些层次结构级别中,同一配置对象可以多次发生。对象的每个实例都有唯一的标识符,用于将其与其他实例区分。在CLI表示法中,此类对象的父语句可能由关键字和标识符或只是一个标识符组成。
keyword identifier {
… configuration statements for individual characteristics …
}
keyword 是一个固定字符串,用于指示要定义的对象类型,也是该类型实例 identifier 的唯一名称。在下面的示例中, user 是 关键字 , 是 username 标识符。
user username {
/* child statements */
}
在 JSON 中,配置对象的所有实例均包含在单个名称/值对中,其中字段名称通常与字符串匹配,并且该值是一组 JSON 对象,每个对象都是配置对象的实例。 keyword JSON 语法不同于CLI标识符的处理方法。在 JSON 中,配置对象的每个实例都对标识符使用名称/值对,其中字段名称将此数据识别为标识符,并且值是对象的实际唯一标识符。通常,字段名称只是 name 。某些对象有多个标识符,可能会使用字段名称,而非 name 。指定标识符的 JSON 数据始终在相应对象中列出,但在此对象包括的任何属性列表之后。
{
"keyword" : [
{
"@" : {
"comment" : "comment"
},
"name" : "identifier",
JSON data for individual characteristics
},
{
"name" : "identifier",
JSON data for individual characteristics
}
]
}
Junos OS保留配置 junos- 组内定义的配置组的标识符 junos-defaults 的前缀。用户定义的标识符不能从字符串开始 junos- 。
大多数具有标识符的对象的配置包含附加叶语句,表示对象的其他特征。例如,在层次结构级别BGP组都有一个关联名称(标识符),并可以具有其他特性的叶语句,例如类型、对等自治系统 (AS) 编号和邻接方地址。 [edit protocols bgp group] 有关叶语句的 JSON 映射的信息,请参阅 单值和固定形式叶语句 的映射。
以下示例显示将格式化的 ASCII 文本映射到 JSON,用于定义两个名称为 G1 和 G2 BGP组的配置语句。在 JSON 语法中,该成员的值是一个阵列,包含每个组 group 单独的 JSON BGP。
CLI配置语句
protocols {
bgp {
group G1 {
type external;
peer-as 64501;
neighbor 10.0.0.1;
}
group G2 {
type external;
peer-as 64502;
neighbor 10.0.10.1;
}
}
}
JSON 语法
{
"configuration" : {
"protocols" : {
"bgp" : {
"group" : [
{
"name" : "G1",
"type" : "external",
"peer-as" : "64501",
"neighbor" : [
{
"name" : "10.0.0.1"
}
]
},
{
"name" : "G2",
"type" : "external",
"peer-as" : "64502",
"neighbor" : [
{
"name" : "10.0.10.1"
}
]
}
]
}
}
}
}
单值和固定形式叶语句的映射
叶 语句 是不包含CLI语句的一个配置语句。大多数叶语句都为配置对象的一个特性定义了一个值,其形式如下:
keyword value;
Junos OS叶语句映射到 JSON 中的名称/值对。通常,字段名称与字符串相同,并且值 keyword 与字符串 value 相同。
以下示例显示两个包含关键字和值的叶语句的 JSON 映射:层级的 语句和 层次结构级别的 message [edit system login] preference [edit protocols ospf] 语句。
CLI配置语句
system {
login {
message "Authorized users only.";
... other statements under login ...
}
}
protocols {
ospf {
preference 15;
... other statements under ospf ...
}
}
JSON 语法
{
"configuration" : {
"system" : {
"login" : {
"message" : "Authorized users only.",
... JSON data for other statements under login ...
}
},
"protocols" : {
"ospf" : {
"preference" : "15",
... JSON data for other statements under ospf ...
}
}
}
}
某些叶语句仅包含固定格式关键字,没有关联的可变形式值。Junos OS 将名称/值对中的值设置为 ,来表示 JSON 中的此类 [null] 语句。以下示例显示 语句在层级的 JSON disable [edit forwarding-options sampling] 映射。
CLI配置语句
forwarding-options {
sampling {
disable;
}
}
JSON 语法
{
"configuration" : {
"forwarding-options" : {
"sampling" : {
"disable" : [null]
}
}
}
}
使用多个值的叶语句的映射
某些Junos OS叶语句接受多个值,可以是用户定义的值,也可从一组预定义值绘制。CLI表示法使用方括号将所有值括在单个语句中,如以下示例所示:
keyword [ value1 value2 value3 ...];
如 "为单值和固定形式叶语句映射"中讨论,叶语句将映射到 JSON 中的名称/值对,JSON 中的字段名称与字符串 keyword 相同。要表示多个值,JSON 数据的值部分使用一系列逗号分隔字符串。
以下示例显示使用多个用户定义值CLI语句的 JSON 映射。语句 import 导入在配置其他位置定义的两个路由策略。格式化的 ASCII 文本使用空间分隔的值列表,而 JSON 数据使用用逗号分隔字符串列表的阵列。
CLI配置语句
protocols {
bgp {
group 23 {
import [ policy1 policy2 ];
}
}
}
JSON 语法
{
"configuration" : {
"protocols" : {
"bgp" : {
"group" : [
{
"name" : "23",
"import" : ["policy1", "policy2"]
}
]
}
}
}
}
以下示例显示具有多个预定义值的 CLI 语句的 JSON 映射。该 permissions 语句向登录类的成员授予三个预定义 user-accounts 的权限。
CLI配置语句
system {
login {
class user-accounts {
permissions [ admin configure control ];
}
}
}
JSON 语法
{
"configuration" : {
"system" : {
"login" : {
"class" : [
{
"name" : "user-accounts",
"permissions" : ["admin", "configure", "control"]
}
]
}
}
}
}
在一行或多行上映射多个选项
对于某些Junos OS配置对象,标准CLI语法在单个行中提供了多个选项,通常增加简洁性和简洁性。在大多数情况下,第一个选项标识对象且没有关键字,但后来将选项与关键字和值配对。
在 JSON 中,相同的配置对象映射到一个名称/值对。字段名称与对象名称相同,值是一个 JSON 对象,其中包含由名称/值对表示的选项。如果第一个选项在 CLI 语句中没有关键字,JSON 映射将分配一个名称,这等同于在模式中定义的选项名称,用于相应的 Junos XML 标记名称。
以下示例显示单个线路上多个CLI配置语句的 JSON 映射。语句的 JSON 表示为两个选项使用名称/值对,并分配没有关键字的第一个选项 [edit system backup-router] address (10.0.0.1) 的CLI名称。
CLI配置语句
system {
backup-router 10.0.0.1 destination 10.0.0.2/32;
}
JSON 语法
{
"configuration" : {
"system" : {
"backup-router" : {
"address" : "10.0.0.1",
"destination" : ["10.0.0.2/32"]
}
}
}
}
某些配置对象的语法包括多个多选项行。在 JSON 中,配置对象映射到名称/值对,如上一用例中。字段名称与对象名称相同,值是一个 JSON 对象,其中包含由名称/值对表示的选项。对于每个选项,字段名称都与选项名称相同,值是一个 JSON 数据结构,可相应表示此选项的配置数据。当选项使用相同的关键字但跨越多个行时,JSON 表示将选项组合为单个名称/值对。在这种情况下,该值是一系列 JSON 对象,其中每个选项都映射到一个独立对象。
以下示例显示 语句在层级的 JSON traceoptions [edit protocols isis] 映射。该 traceoptions 语句具有三个子语句,每个子语句有多个选项。JSON CLI表示法在单独行上显示各个选项,但 JSON 表示法将详细信息组合为 flag flag 单个名称/值对。该值是一系列对象,其中每个对象都包含一个标志的详细信息。
CLI配置语句
protocols {
isis {
traceoptions {
file trace-file size 3m files 10 world-readable;
flag route detail;
flag state receive;
}
}
}
JSON 语法
{
"configuration" : {
"protocols" : {
"isis" : {
"traceoptions" : {
"file" : {
"filename" : "isis-trace-file",
"size" : "3m",
"files" : 10,
"world-readable" : [null]
},
"flag" : [
{
"name" : "route",
"detail" : [null]
},
{
"name" : "state",
"receive" : [null]
}
]
}
}
}
}
}
属性映射
该Junos OS配置层次结构可以包含用于修改层次结构或语句的标记。例如,如果发出 命令以停用配置中的语句,则标记会预先标记到配置中的项, deactivate inactive: 以指示此属性。Junos XML API 将属性表示为 XML 元素开放标记中的属性。
该配置中的 JSON 表示Junos OS元数据注释来表示这些属性。元数据注释将编码为单个 JSON 对象的成员,并在其名称中包括"@"符号。
代表容器语句属性列表的元数据对象将添加为该对象的新产品。元数据对象直接放在其修改的容器对象中,并使用单个"@"符号作为成员名称。代表叶语句属性列表的元数据对象将添加为一个面值名称/值对,该名称直接在修改语句之后放置,并且具有与"@" 符号和语句名称串联的成员名称。这两种情况下的元数据对象值都是包含名称/值对的对象,用于描述与该容器或叶语句关联的每个属性。
{
"container" : {
"@" : {
"attribute-name" : attribute-value,
"attribute-name" : attribute-value
},
"statement-name" : "statement-value",
"@statement-name" : {
"attribute-name" : attribute-value,
"attribute-name" : attribute-value
}
}
}
在下面的示例中,层次结构和 [edit commit] persist-groups-inheritance 语句已停用。在 CLI 中,语句前面是 inactive: 标记。Junos XML 表示包括 inactive="inactive" 这些元素的每个开始标记中的属性。JSON 映射将属性存储在属性列表中。层次结构的属性列表 [edit commit] 以"@"表示,因为它是容器语句。该语句的属性 persist-groups-inheritance 列表使用"@persist组继承"表示,因为它是叶语句。
CLI配置语句
system {
inactive: commit {
inactive: persist-groups-inheritance;
}
}
XML 语法
<configuration>
<system>
<commit inactive="inactive">
<persist-groups-inheritance inactive="inactive"/>
</commit>
</system>
</configuration>
JSON 语法
{
"configuration" : {
"system" : {
"commit" : {
"@" : {
"inactive" : true
},
"persist-groups-inheritance" : [null],
"@persist-groups-inheritance" : {
"inactive" : true
}
}
}
}
}
对象特定实例的属性列表类似于容器的属性列表,其中名称/值对,其中字段名称为单个"@"符号,值是包含名称/值对的对象,用于描述每一个属性。属性列表包含在 JSON 对象中,用于标识该实例,是对象中第一个成员,然后是对象的标识符。
{
"keyword" : [
{
"@" : {
"attribute-name" : attribute-value
},
"name" : "identifier",
...JSON data for individual characteristics...
},
/* additional objects */
]
}
在下面的示例中,ge-0/0/0 接口受到保护。在CLI中,对象前面是 protect: 标记。该Junos XML 表示包括 protect="protect" 此对象的开放标记中的属性。JSON 映射将属性存储在识别该特定接口的 JSON 对象中包含的 "protect" : true 属性列表中。
CLI配置语句
protect: ge-0/0/0 {
unit 0 {
family inet {
address 198.51.100.1/24;
}
}
}
XML 语法
<configuration>
<interfaces>
<interface protect="protect">
<name>ge-0/0/0</name>
<unit>
<name>0</name>
<family>
<inet>
<address>
<name>198.51.100.1/24</name>
</address>
</inet>
</family>
</unit>
</interface>
</interfaces>
</configuration>
JSON 语法
{
"configuration" : {
"interfaces" : {
"interface" : [
{
"@" : {
"protect" : true
},
"name" : "ge-0/0/0",
"unit" : [
{
"name" : 0,
"family" : {
"inet" : {
"address" : [
{
"name" : "198.51.100.1/24"
}
]
}
}
}
]
}
]
}
}
}
映射配置注释
配置Junos OS可包含介绍配置中的语句的注释。使用 ASCII 文本或 Junos XML 元素格式化的配置数据显示注释修改语句之前行的注释。在Junos XML 格式中,注释字符串包含于元素 <junos:comment> 中。
注释使用两个分隔符之一表示:成对字符串和分隔符(注释括起来)或 /* */ # 注释之前的字符。在配置中插入注释时,您可以使用注释字符串中的任一分隔符。如果省略分隔符,Junos OS将自动插入 /* */ 和 。
Junos OS保留注释中包含的任何空格。
Junos OS JSON 格式的配置数据将注释映射到名称/值对,该名称/值对作为其修改的语句属性存储。字段名称设置为 "comment" ,值是注释文本字符串。注释文本字符串可以包含两个表示注释的分隔符之一。如果在加载 JSON 配置数据时省略注释文本字符串中的分隔符,Junos OS将自动为注释添加 和分隔 /* */ 符。您也可在 JSON 配置数据中创建多行注释,方法为在注释字符串中插入线字符 ( \n )。
以下示例显示三个注释的格式化 ASCII 配置和相应的 JSON 语法。该示例将一个注释与层次结构关联,将另一个注释与具有标识符的对象关联,将第三个注释与叶语句关联。
CLI配置语句
protocols {
/* New backbone area */
ospf {
area 0.0.0.0 {
/* From jnpr1
to jnpr2 */
interface so-0/0/0.0 {
# set by admin
hello-interval 5;
}
}
}
}
JSON 语法
{
"configuration" : {
"protocols" : {
"ospf" : {
"@" : {
"comment" : "/* New backbone area */"
},
"area" : [
{
"name" : "0.0.0.0",
"interface" : [
{
"@" : {
"comment" : "/* From jnpr1 \n to jnpr2 */"
},
"name" : "so-0/0/0.0",
"hello-interval" : 5,
"@hello-interval" : {
"comment" : "# set by admin"
}
}
]
}
]
}
}
}
}