設定Junos OSステートメントを JSON にマップ
ノードを実行するデバイスの設定Junos OSステートメントの階層として格納されます。設定ステートメントの階層には、次の 2 種類のステートメントがあります。
コンテナ ステートメント— 他のステートメントを含むステートメント
リーフ ステートメント— 他のステートメントを含ではないステートメント
コンテナ ステートメントとリーフ ステートメントはすべて、設定階層を 形成します。
設定階層は、フォーマットされたASCIIテキスト、XML要素Junos設定モード コマンドの他に、JSON(JavaScript Object Notation)を使用して表 set されます。Junos OS リリース 14.2 から、json 形式で コマンドを実行することで、Junos OS を実行しているデバイスの設定を JSON 形式で show configuration | display json CLI。さらに、リリース 16.1 Junos OSから、JSON 形式の設定データをデバイスにロードできます。
Junos OS リリース 16.1 から、Junos OS を実行するデバイスは、シリアル化用の新しいデフォルト実装を使用して、JSON 形式の設定データを送信します。新しいデフォルトを明示的に設定するか、または階層レベルで適切なステートメントを設定することで、前のデフォルト ietf verbose に [edit system export-format json] 戻することもできます。ステートメントは、Junos OS Release 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 オブジェクトです。また、その階層に関連付けられた属性のリストがある場合は、そのオブジェクトにメンバーを含め設定することもできます。
次の例は、設定階層の上位レベルにある 2 つのステートメントについて、フォーマットされた 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 マッピングの詳細については、「 単一値および固定形式のリーフ ステートメントのマッピング 」 を参照してください。
次の例では、G1 および G2 という名前の 2 つのグループを定義する設定ステートメントにおいて、フォーマットされた ASCII テキストと JSON BGPマッピングを示しています。JSON構文では、メンバーの値は、グループごとに別のJSONオブジェクトを含む group 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を含ではない、設定ステートメントの 1 つのステートメントです。ほとんどのリーフ ステートメントは、設定オブジェクトの 1 つの特性に値を定義し、次の形式を使用します。
keyword value;
Junos OS ステートメントは、JSON で名前と値のペアにマッピングされます。一般的に、フィールド名は文字列と同じで、値は文字列 keyword と同 value じです。
次の例は、キーワードと値を持つ 2 つのリーフ ステートメント(階層レベルのステートメントと階層レベルのステートメント)の 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 の名前と値のペアにマッピングされます。フィールド名は文字列と同 keyword じです。複数の値を表す場合、JSON データの値の部分はカンマ区切り文字列のアレイを使用します。
次の例は、複数のユーザー定義値を持つCLIステートメントの JSON マッピングを示しています。ステートメント import は、設定の別の場所で定義された2つのルーティング ポリシーをインポートします。フォーマットされたASCIIテキストでは、スペースで区切られた値のリストを使用し、JSONデータはカンマ区切りの文字列リストを持つアレイを使用します。
CLI設定ステートメント
protocols {
bgp {
group 23 {
import [ policy1 policy2 ];
}
}
}
JSON構文
{
"configuration" : {
"protocols" : {
"bgp" : {
"group" : [
{
"name" : "23",
"import" : ["policy1", "policy2"]
}
]
}
}
}
}
次の例は、事前定義された複数の値を持つCLIステートメントの JSON マッピングを示しています。ステートメント permissions によって、ログイン クラスのメンバーに事前定義された 3 つの権限が user-accounts 付与されます。
CLI設定ステートメント
system {
login {
class user-accounts {
permissions [ admin configure control ];
}
}
}
JSON構文
{
"configuration" : {
"system" : {
"login" : {
"class" : [
{
"name" : "user-accounts",
"permissions" : ["admin", "configure", "control"]
}
]
}
}
}
}
1 つ以上の行の複数オプションのマッピング
一部の構成Junos OSでは、標準の構文により、通常は読みCLI簡潔性を高め、1 行に複数のオプションを追加できます。ほとんどの場合、最初のオプションはオブジェクトを識別し、キーワードを持ってはいますが、それ以降のオプションは組み合わせのキーワードと値です。
JSON では、同じ設定オブジェクトが名前と値のペアにマッピングされます。フィールド名はオブジェクト名と同じで、値はオプションを含む JSON オブジェクトで、名前と値のペアで表されます。最初のオプションに CLI ステートメントにキーワードがない場合、JSON マッピングによって、スキーマで定義されたオプション名に相当する名前が割り当てJunos XML タグ名に使用されます。
次の例は、1 行に複数のオプションを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 には 3 つの子ステートメントがあります。各ステートメントには複数のオプションがあります。表CLI表記では、個々のオプションが別々の行に表示されますが、JSON 表現では詳細が 1 つの名前と値のペア flag flag に結合されています。値は、各オブジェクトに1つのフラグの詳細が含まれているオブジェクトのアレイです。
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: を示します。XML API Junos XML 要素の開始タグの属性としてこのプロパティを表します。
JSON 表現のメタデータJunos OSメタデータ 注釈を使用してこれらのプロパティを表現します。メタデータの注釈は、単一のJSONオブジェクトのメンバーとしてエンコードされ、名前としてまたは名前内に「@」記号が含まれます。
コンテナ ステートメントの属性リストを表すメタデータ オブジェクトは、そのオブジェクトの新しいメンバーとして追加されます。メタデータ オブジェクトはコンテナ オブジェクト内に直接配置され、変更を行い、1 つの「@」記号をメンバー名として使用します。リーフ ステートメントの属性リストを表すメタデータ オブジェクトは、変更したステートメントの直後に配置される大小の名前/値のペアとして追加され、メンバー名は「@」記号とステートメント名の連結を使用します。どちらの場合もメタデータ オブジェクトの値は、そのコンテナまたはリーフ ステートメントに関連付けられた各属性を記述する名前と値のペアを含むオブジェクトです。
{
"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: されます。XML 表現Junos要素の各開始タグに inactive="inactive" 属性が含まれています。JSON マッピングを実行すると、属性が属性リストに保存されます。階層の属性リストは「@」と示されています。コンテナ ステートメント [edit commit] のためです。ステートメントの属性リスト persist-groups-inheritance は、「@persist-groups-継承」を使用して示されています(リーフ ステートメントのため)。
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: されます。XML Junos表現には、その 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 テキストまたは XML 要素を使用してフォーマットJunos設定データには、コメントが変更されるステートメントの前の行にコメントが表示されます。XML Junosコメント文字列は、要素で囲 <junos:comment> まれます。
コメントは、ペアの文字列とコメントの括弧、またはコメントの前にある文字という 2 つの区切り記号のいずれかを使用 /* */ # して示します。コメントの区切り記号は、設定にコメントを挿入する場合に使用できます。区切り記号を省略するとJunos OS挿入 /* され */ 、 .
Junos OS含まれる空白は保持します。
Junos OS設定データを JSON を使用してフォーマットした場合、コメントはステートメントの属性として格納された名前と値のペアにマッピングされます。フィールド名が に設定 "comment" され、値はコメントテキスト文字列です。コメントテキストの文字列には、コメントを示す区切り記号 2 つのいずれかを含めできます。JSON 設定データを読み込む際に、コメントテキストの文字列から区切り記号を省略した場合、Junos OS区切り記号を自動的にコメント /* */ に追加します。また、JSON 設定データにマルチライン コメントを作成するには、コメント文字列に新しい文字( ) \n を挿入します。
次の例は、3つのコメントでフォーマットされたASCII設定と対応するJSON構文を示しています。この例では、1 つのコメントを階層に関連付け、別のコメントを識別子を持つオブジェクト、3 つ目のコメントをリーフ ステートメントに関連付てます。
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"
}
}
]
}
]
}
}
}
}