XML for NSO - Beginner
구조적 데이터 Vs 비구조적 데이터
- 데이터는 다양한 형태와 크기로 존재
- 구조적 데이터 : 명확하게 정의된 형태와 기능을 가진다. 예측 가능하여 위치, 읽기 및 이해가 쉽고, 체계적인 데이터 처리, 저장, 쿼리 및 사용이 가능하다.
- 비구조적 데이터 : 구조적 데이터를 제외한 모든 데이터. 내부 구조를 가질 수 있지만, 미리 정의된 데이터 모델을 사용하지 않는다.
- 흔히 사용되는 텍트스 기반 데이터 형식은 XML, JSON, YAML이다.
- XML
- HTML과 유사하지만 구문이 훨씬 엄격.
- 거의 모든 실제 개념을 설명할 수 있는 언어이며, 요소의 트리 구조를 사용
- 요소는 사용자 정의 태그로 묶이며, 태그는 꺽쇠 괄호를 구분 기호로 사용
- 중복된 데이터 포함이 가능해 가독성이 떨어지지만, 복잡한 데이터 관리 시 다른 언어보다 뛰어난 기능을 제공
<?xml version="1.0" encoding="UTF-8" ?> <root> <switch_id>714</switch_id> <interface_type>Ethernet</interface_type> <interface-id>0/1</interface-id> </root>
- JSON
- Javascript 프로그래밍 언어에서 객체를 표시하는 방법에서 시작했지만 자체적으로 독립적인 언어
- 쉼표로 구분되고 중괄호 { }로 묶인 키-값 쌍의 집합 사용
{ "switch_id":714, "interface_type":"Ethernet", "interface-id":"0/1" }
- YAML
- 세 가지 형식 중 가장 사람일 읽기 쉬움
- 데이터 들여쓰기를 사용해 구조 구성
- 비계층적 구조를 쉽게 표현하고 여러 지점에서 데이터 참조 가능
switch_id: 714 interface_type: Ethernet interface-id: 0/1
- 데이터 형식 간 변화
- JSON, YAML, XML 간의 데이터 변환은 가능하다
- 복잡한 데이터일 수록 변환에 문제가 발생할 수 있다.
- 발생할 수 있는 문제점
- JSON의 namespace 부족
- 구문으로 제한되는 XML 요소 이름 (숫자 시작 불가)
- JSON 고유한 키 필요
- XML 요소는 복잡한 구조 포함 가능
- XML은 루트 객체 필요
- YAML은 모든 것을 문자열로 처리
- JSON은 주석 지원 안 함
- XML 블록 JSON 변환
- XML
<?xml version="1.0" encoding="UTF-8"?> <devices xmlns="equipment"> <device type="router"> <os vendor="Cisco">IOS</os> <version>15.2</version> </device> <device type="switch"> <os vendor="Cisco">IOS-XR</os> <version>7.1</version> <model>ASR9000</model> </device> </devices>
- JSON으로 변환한 XML
{ "devices": { "device": [ { "os": { "_vendor": "Cisco", "__text": "IOS" }, "version": "15.2", "_type": "router" }, { "os": { "_vendor": "Cisco", "__text": "IOS-XR" }, "version": "7.1", "model": "ASR9000", "_type": "switch" } ], "_xmlns": "equipment" } }
- XML
- XML과 네트워크 장치
- 많은 네트워크 장치는 XML 구문 지원
XML 문서의 구조
- 트리 형태로 내부적 구성
- root elements로 시작해 child elements와 sub elements로 뻗어감
- root elements는 항상 XML 문서에 존재해야 하며 config가 root elements의 역할을 수행
- XML 문서의 기본 구성 요소
- 텍스트
- 속성
- 다른 요소
- 위 세 가지의 조합
- 아무것도 없음
- 종료 태그는 항상 시작 태그와 동일하며 슬래시 문자가 추가
- 이름 규칙
- 공백 포함 불가. 대신 밑줄 사용 가능
- 숫자로 시작하거나 "xml"로 시작 불가
- 영숫자 문자와 하이픈, 밑줄, 마침표만 포함 가능
- 대소문자를 구분
XML 문서에 metadata 추가
- XML 문서는 데이터를 설명할 뿐 아니라, 데이터에 대한 데이터를 포함할 수 있다.
- XML Prolog
필수는 아니지만 문서 상단에 위치<?xml version=“1.0” encoding=“utf-8”?>
- Document Type Definition
- XML 문서의 구조와 허용 가능한 요소 및 속성 정의
- 데이터 유효성 검증 및 XML 문서 검증에 사용 될 수 있다.
- 선택사항
- XML Schema
- XML 문서 구조를 설명하는 복잡한 방법
- 모델링하는 문서의 요소를 정의
- 네임스페이스 URI을 따라 스키마 식별 가능
- XML 속성
- XML 문서에 버전 및 인코딩 매개변수를 추가하는 것처럼 XML 속성을 특정요소에 추가할 수 있다.
- 이름 충돌 해결
- XML 요소 이름과 구조는 XML 문서를 만든 사람이나 데이터를 저장하기 위해 XML 문서를 사용하는 시스템에 의해 정의
- 동일한 이름을 가진 요소가 존재할 수 있지만, 동일한 의미를 가지지 않을 수 있기 때문.
- 실제 XML 안에 들어있는 구성요소인 <config> 안에 들어있는 태그를 <ios:config>, <iosxr:config>와 같이 구분
- 상위 요소에서 태그 정의를 통한 구분
<devices> <device> <name>Router-01</name> <os>IOS</os> <config xmlns="http://cisco.com/cisco-ios"> <hostname>...</hostname> <protocols>...</protocols> <interface>...</interface> </config> </device>
XML in NSO
- NSO에서의 XML 사용 사례
- 구성데이터를 저장하고 표시
- XML을 통한 구성 템플릿 생성
- YANG 데이터 모델의 XML 설명 용이성
- NETCONF 프로토콜의 XML 기반 메시지
- NSO CDB 장치 동기화
developer 장치 접속 이후 장치 동기화ssh developer@10.10.20.49 [developer@nso ~]$ ncs_cli -C -u developer developer@ncs# devices sync-from
- NSO에서 XML 데이터 보기
CLI 출력 기반 dist-rtr01에 대한 구성 확인출력 형식 지정show running-config devices device <device_name>
show running-config devices device <device_name> | display <format>
- Configuration Database(CDB)란?
- 모든 관리 장치의 최신 구성 복사본
- NSO 자체 구성
- NSO가 관리하는 서비스의 구성
- 관리하는 장치에서 제공하는 모든 운영 데이터
- CDB의 장점
- 네트워크 장치의 구성 데이터 처리를 위한 견고한 모델 제공
- 구성되지 않은 장치가 네트워크에서 구성 데이터를 찾고 적용할 수 있는 네트워크 API 제공
- 빠른 경량 데이터베이스 접근 가능
- 구성 데이터의 자동 업그레이드/다운그레이드 지원
- XML 및 텍스트 기반으로 사용자 상호 작용 및 버전 관리 시스템 사용 용이
- Template에서 XML 사용
- NSO는 XML 기반 구성 템플릿을 사용하여 네트워크 장치에 구성 변경 사항을 적용
- XPath 표현식 : {}
XPath를 사용한 XML 데이터 탐색
- 구조가 예측 가능하기 떄문에 쿼리 언어를 사용해 데이터 이해 가능
- XPath 쿼리 언어는 XML 및 JSON 문서를 탐색하고 다양한 요소, 속성 및 값을 찾을 수 있다
- XPath에 YANG 문을 함께 사용하면 leafref 매개변수 입력 제한 가능
- XPath 표현식
- XPath는 서비스 매개변수가 구성의 어느 부분에서 참조되든 XML 구성에 올바르게 매핑되고 적절하게 재사용되도록 보장
- NSO에 XPath 표시
developer@ncs# show running-config devices device core-rtr01 config interface GigabitEthernet 0/0/0/1 ipv4 address | display xpath /devices/device[name='core-rtr01']/config/cisco-ios-xr:interface/GigabitEthernet[id='0/0/0/1']/ipv4/address/ip 172.16.253.2 /devices/device[name='core-rtr01']/config/cisco-ios-xr:interface/GigabitEthernet[id='0/0/0/1']/ipv4/address/mask 255.255.255.248 developer@ncs#show
참고 : https://developer.cisco.com/learning/tracks/get_started_with_nso/