JSON에 Junos OS 구성 명령문 매핑
Junos OS를 실행하는 디바이스의 구성은 명령문의 계층으로 저장됩니다. 구성 명령문 계층에는 두 가지 유형의 명령문이 있습니다.
컨테이너 명령문—다른 명령문이 포함된 명령문
리프 명령문—다른 명령문을 포함하지 않는 명령문
모든 컨테이너와 리프 명령문이 함께 구성 계층을 형성합니다.
형식화된 ASCII 텍스트, Junos XML 요소 및 구성 모드 set
명령 외에도 JSON(JavaScript Object Notation)을 사용하여 구성 계층을 나타낼 수 있습니다. Junos OS Release 14.2부터 CLI에서 명령을 실행하여 JSON 형식으로 Junos OS를 실행하는 디바이스의 구성을 show configuration | display json
볼 수 있습니다. 또한 Junos OS 릴리스 16.1부터 디바이스에서 JSON 형식의 구성 데이터를 로드할 수 있습니다.
Junos OS 릴리스 16.1부터 Junos OS를 실행하는 디바이스는 직렬화를 위한 새로운 기본 구현을 사용하여 JSON 형식의 구성 데이터를 방출합니다. 계층 수준에서 적절한 명령 [edit system export-format json]
문을 구성하여 새 기본값ietf
을 명시적으로 구성하거나 이전 기본값verbose
으로 되돌릴 수 있습니다. 이후 릴리스까지 Junos OS CLI에 문이 노출되지 않더라도 Junos OS 릴리스 16.1R1에서 시작하는 문을 구성할 verbose
수 있습니다.
Junos OS 릴리스 16.1R4, 16.2R2 및 17.1R1부터 시작하여 JSON 형식으로 방출되는 Junos OS 구성 데이터의 정수는 견적표에 동봉되지 않습니다. 이전 릴리스에서 JSON 구성 데이터의 정수는 문자열로 취급되며 견적 표시로 동봉됩니다.
다음 섹션에서는 형식화된 ASCII 텍스트와 JSON의 Junos OS 구성 명령문에 사용되는 기본 형식 간의 매핑에 대해 설명합니다.
계층 수준 및 컨테이너 명령문에 대한 매핑
Junos OS 구성 계층은 필드 이름 "configuration"
및 전체 구성을 나타내는 JSON 객체가 포함된 값을 가진 단일 최상위 멤버 또는 이름/값 쌍을 가진 JSON 객체에 의해 JSON에 표시됩니다. 구성원은 configuration
CLI 구성 모드의 [edit]
계층 수준에 해당합니다. 구성 계층의 다음 몇 가지 수준에서 대부분의 명령문은 컨테이너 명령문입니다.
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에서 구성 객체의 모든 인스턴스는 필드 이름이 일반적으로 문자열과 일치하는 keyword
단일 이름/값 쌍 내에 포함되며 값은 각각 구성 객체의 인스턴스인 JSON 객체의 배열입니다. 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는 구성 그룹 내에서 정의된 구성 그룹의 식별자를 위한 Prefix junos-
를 예약합니다 junos-defaults
. 사용자 정의 식별자는 문자열 junos-
로 시작할 수 없습니다.
식별자가 있는 대부분의 객체에 대한 구성에는 객체의 다른 특성을 나타내는 추가 리프 명령문이 포함됩니다. 예를 들어 계층 수준에서 구성된 [edit protocols bgp group]
각 BGP 그룹은 연결된 이름(식별자)을 가지며 유형, AS(Peer Autonomous System) 번호 및 이웃 주소와 같은 다른 특성에 대한 리프 명령문을 가질 수 있습니다. 리프 문에 대한 JSON 매핑에 대한 자세한 내용은 단일 가치 및 고정형 리프 명령문 매핑을 참조하십시오.
다음 예에서는 G1 및 G2라는 두 개의 BGP 그룹을 정의하는 구성 명령문을 위해 형식화된 ASCII 텍스트를 JSON에 매핑하는 것을 보여 줍니다. JSON 구문 group
에서 멤버의 값은 각 BGP 그룹에 대해 별도의 JSON 객체를 포함하는 배열입니다.
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
동일합니다.
다음 예에서는 키워드와 값 message
이 있는 2개의 리프 명령문에 대한 JSON 매핑을 보여 줍니다 . 즉, 계층 수준의 명령 [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는 이름/값 쌍 [null]
으로 값을 설정하여 JSON에서 이러한 진술을 나타냅니다. 다음 예에서는 계층 수준의 명령문에 disable
대한 JSON 매핑을 [edit forwarding-options sampling]
보여줍니다.
CLI 구성 명령문
forwarding-options { sampling { disable; } }
JSON 구문
{ "configuration" : { "forwarding-options" : { "sampling" : { "disable" : [null] } } } }
여러 값을 가진 리프 명령문 매핑
일부 Junos OS 리프 명령문은 사용자 정의 또는 사전 정의된 값 집합에서 도출될 수 있는 여러 값을 허용합니다. CLI 표기법은 다음 예와 같이 정사각형 브래킷을 사용하여 모든 값을 단일 문에 동봉합니다.
keyword [ value1 value2 value3 ...];
단일 가치 및 고정형 리프 명령문 매핑에서 설명한 바와 같이, 리프 명령문은 필드 이름이 문자열과 동일한 keyword
JSON의 이름/값 쌍에 매핑됩니다. 여러 값을 나타내기 위해 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
로그인 클래스의 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 매핑을 보여줍니다. 명령문의 [edit system backup-router]
JSON 표현은 두 옵션 모두에 대해 이름/값 쌍을 사용하고 CLI 키워드가 없는 첫 번째 옵션(10.0.0.1)의 필드 이름을 address
할당합니다.
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 개체의 배열입니다.
다음 예에서는 계층 수준의 명령문에 traceoptions
대한 JSON 매핑을 [edit protocols isis]
보여줍니다. 문 traceoptions
에는 3개의 자식 명령문이 있으며, 각 문에는 여러 옵션이 있습니다. CLI 표기법은 개별 라인에 개별 flag
옵션을 표시하지만 JSON 표현은 세부 사항을 단일 이름/값 쌍으로 결합합니다 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 구성 계층에는 계층 또는 명령문을 수정하는 태그가 포함될 수 있습니다. 예를 들어, 컨피 inactive:
규레이션에서 deactivate
명령문을 비활성화하는 명령을 실행하면 이 속성을 표시하기 위해 태그가 구성의 항목에 미리 지정됩니다. Junos XML API는 XML 요소의 오프닝 태그에서 이 속성을 속성으로 나타냅니다.
Junos OS 구성의 JSON 표현은 메타데이터 주석을 사용하여 이러한 속성을 나타냅니다. 메타데이터 주석은 단일 JSON 객체의 구성원으로 인코딩되며 이름 내에 "@" 기호를 포함합니다.
컨테이너 명령문의 속성 목록을 나타내는 메타데이터 개체가 해당 객체의 새 구성원으로 추가됩니다. 메타데이터 개체는 컨테이너 객체 내에서 직접 배치되어 수정하고 단일 "@" 기호를 구성원 이름으로 사용합니다. 리프 명령문의 속성 목록을 나타내는 메타데이터 개체는 "@" 기호와 명령문 이름의 결합인 구성원 이름 및 수정문 바로 뒤에 배치되는 형제 이름/값 쌍으로 추가됩니다. 두 케이스의 메타데이터 객체 값은 해당 컨테이너 또는 리프 명령문과 관련된 각 속성을 설명하는 이름/값 쌍을 포함하는 객체입니다.
{ "container" : { "@" : { "attribute-name" : attribute-value, "attribute-name" : attribute-value }, "statement-name" : "statement-value", "@statement-name" : { "attribute-name" : attribute-value, "attribute-name" : attribute-value } } }
다음 예에서는 계층 및 명령문이 persist-groups-inheritance
모두 [edit commit]
비활성화되었습니다. 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 매핑은 특정 인터페이스를 "protect" : true
식별하는 JSON 객체에 포함된 속성 목록에 속성을 저장합니다.
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는 주석에 포함된 모든 공백을 보존합니다.
JSON을 사용하여 형식화된 Junos OS 구성 데이터는 수정하는 명령문의 속성으로 저장되는 이름/값 쌍에 주석을 매핑합니다. 필드 이름이 로 설정 "comment"
되고 값이 주석 텍스트 문자열입니다. 주석 텍스트 문자열은 주석을 나타내는 두 구분 기호 중 하나를 포함할 수 있습니다. JSON 구성 데이터를 로드할 때 주석 텍스트 문자열에서 구분 기호를 생략하면 Junos OS가 자동으로 주석에 /*
이 및 */
구분 기호를 추가합니다. 또한 주석 문자열에 새라인 문자(\n
)를 삽입하여 JSON 구성 데이터에서 멀티라인 주석을 생성할 수도 있습니다.
다음 예제에서는 세 가지 설명에 대해 형식화된 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" } } ] } ] } } } }