NSO Simple Python

실험실 환경 설정

  • NSO 인스턴스와 시뮬레이션 Cisco IOS 장치 시작
    ncs-netsim --dir ~/src/netsim create-device $NCS_DIR/packages/neds/cisco-ios-cli-3.8 netsim-ios
    ncs-setup --dest ~/src --netsim-dir ~/src/netsim
    cd ~/src
    ncs-netsim start
    ncs
    ncs_cli -C -u admin
  • 장치 구성 학습
    devices sync-from
    exit
  • 구성 확인
    IOS 장치 구성 확인
    ncs-netsim cli-c netsim-ios
    netsim 프롬포트 내의 전체 구성 확인
    paginate false
    show running-config
    exit

NSO Python API

  • Magic automation
    • import ncs로 사용할 수 있으며, Yang 타입을 Python 클래스로 표현
    • CRUD 작업을 수행할 수 있는 Python 매직 메서드를 가지고 있음
  • CDP Run Audit
    • netsim-ios가 활성화 되있는지 확인
      netsim-ios 장치의 CDP 실행상태를 NSO 데이터베이스에서 읽어서 출력
      import ncs
      with ncs.maapi.single_read_trans("admin", "python", groups=["ncsadmin"]) as t:
          root = ncs.maagic.get_root(t)
          device = root.devices.device["netsim-ios"]
          cdp_result = device.config.ios__cdp.run
          print(
              "For Device {}, CDP being enabled is {}".format(device.name, cdp_result)
          )
      기존 인터페이스의 인터페이스 번호 값(name)을 조회
      import ncs
      with ncs.maapi.single_read_trans("admin", "python", groups=["ncsadmin"]) as t:
          root = ncs.maagic.get_root(t)
          device = root.devices.device["netsim-ios"]
          for interface in device.config.ios__interface:
              for if_type in device.config.ios__interface[interface]:
                  if hasattr(if_type, "name"):
                      print(
                          f'Device {device.name}, Interface {if_type} {if_type.name}'
                      )

NSO Python API 심층 탐구

  • NSO Python transactions 순서
    1. 트랜잭션 생성
    2. 장치 정보 접근
    3. 데이터 조작
    4. 설정 적용
    5. 트랜잭션 종료
  • 트랜잭션 생성
    1. 대부분의 Python 구문 형태
      with ncs.maapi.single_write_trans('admin', 'python', groups=['ncsadmin']) as t:
          # ... code ...
      admin : 사용자를 나타냄
      groups : 로컬에서는 필요 X, 시스템 설치에서는 종종 ncsadmin 그룹이 설정
      t : 모델의 루트를 얻는데 사용되며, 변경 사항을 커밋할 때 트랜잭션을 적용
    2. single_read_trans
    3. single_write_trans
      1. config 모드와 유사
  • 장치 정보 접근
    python3
    import ncs
    with ncs.maapi.single_read_trans('admin', 'python', groups=['ncsadmin']) as t:
        root = ncs.maagic.get_root(t)
        device_object  = root.devices.device["netsim-ios"]
        print(device_object.name)
    root : CLI 계층 구조의 최상위를 가리키는 포인터
    device_object : NSO 장치 목록에서 "netsim" 장치 이름을 딕셔너리 조회로 참조
    root.devices.device : NSO CDB 모든 장치 참
  • 사용 가능한 객체 메서드 검색
    python3
    import ncs
    
    with ncs.maapi.single_read_trans('admin', 'python', groups=['ncsadmin']) as t:
        root = ncs.maagic.get_root(t)
        device_object  = root.devices.device["netsim-ios"]
        print(dir(device_object))

Manipulating Configuration(설정 조작)

  • 데이터 조작
    • 설정 데이터를 변경하기 위해서는 장치 namespace 필요
    • NSO CLI(| display xpath) 또는 print(dir()) 사용
    • NSO CLI 사용할 경우
      • NSO 터미널 접속 및 명령어 실행
        ncs_cli -C -u admin
        
        paginate false
        show running-config devices device netsim-ios config | display xpath
        exit
    • Python을 사용할 경우
      • nso 쓰기 트랜잭션을 열고, 애플리케이션 데이터 트리의 루트를 가져오고, netsim-ios 장치 구성을 참조하는 축약 변수 생성 뒤 ios:cdp의 run 값을 True 할당 이후, 변경 사항 적용
        python3
        import ncs
        with ncs.maapi.single_write_trans('admin', 'python', groups=['ncsadmin']) as t:
                root = ncs.maagic.get_root(t)
                device_object = root.devices.device["netsim-ios"].config
                device_object.ios__cdp.run = True
                t.apply()
  • Loopback 인터페이스 추가 및 삭제
    • NSO에 인터페이스 유형(ios__interface["Loopbac"])을 알려주고 고유한 이름으로 목록 항목 생성
      python3
      import ncs
      with ncs.maapi.single_write_trans('admin', 'python', groups=['ncsadmin']) as t:
          root = ncs.maagic.get_root(t)
          device_cdb = root.devices.device["netsim-ios"]
          device_cdb.config.ios__interface["Loopback"].create("1337")
          device_cdb.config.ios__interface.Loopback["1337"].ip.address.primary.address = "192.168.1.1"
          device_cdb.config.ios__interface.Loopback["1337"].ip.address.primary.mask = "255.255.255.252"
          t.apply()
    • 백그라운드에서 NSO 새 인터페이스 푸시 및 장치로 전송
      paginate false
      show running-config interface Loopback 1337
      exit
    • loopback 제거
      python3
      import ncs
      with ncs.maapi.single_write_trans('admin', 'python', groups=['ncsadmin']) as t:
          root = ncs.maagic.get_root(t)
          device_cdb = root.devices.device["netsim-ios"]
          del device_cdb.config.ios__interface.Loopback["1337"]
          t.apply()