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 간의 데이터 변환은 가능하다
    • 복잡한 데이터일 수록 변환에 문제가 발생할 수 있다.
    • 발생할 수 있는 문제점
      1. JSON의 namespace 부족
      2. 구문으로 제한되는 XML 요소 이름 (숫자 시작 불가)
      3. JSON 고유한 키 필요
      4. XML 요소는 복잡한 구조 포함 가능
      5. XML은 루트 객체 필요
      6. YAML은 모든 것을 문자열로 처리
      7. 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 문서의 구조

  • 트리 형태로 내부적 구성
  • 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/