将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" } } ] } ] } } } }