Junos Pyez를 사용한 표 및보기

(Nayan Gadre) (2020 년 9 월 12 일)

네트워크 자동화를 위해 Junos pyez 라이브러리를 사용합니다. Junos는 사용자 정의 구성 데이터를 설정하고 추출하기위한 테이블 및보기를 제공합니다. 모든 pyez 코드 및 ncclient는 Apache 2.0 라이선스에 따라 오픈 소스입니다.

lib / jnpr / junos /에서 Yaml 파일의 테이블과보기를 정의합니다. 리소스
예 : “ user.yml “및 해당 로더 파일을“ user.py

user.yml
user.py

user.py ”는 yaml 파일 테이블 및 뷰 정의를 파이썬의 전역 사전 요소로 변환하는 데 사용됩니다. 여기서 \_\_ file \_\_ 는“ user.py ”파일이 표시됩니다. 그런 다음 “ user.yml “파일 이름으로 변환됩니다. 그런 다음 junos pyez의 loadyaml 가“ user.yml ”를 사전에 추가하여 globals () 사전에 추가합니다.

p>

yaml의 테이블 및 뷰 정의 모두 파이썬에서 클래스로 변환됩니다. loadyaml 는 공장 메서드이며 \_\_ all \_\_ 파이썬 선언. 한 줄 스냅에서 볼 수 있듯이 항목 이름 및 항목 클래스 정의 사전을 제공합니다.

user.yml 파일은 2 개의 최상위 키로 분할됩니다.“ UserTable “및 “ UserView ” loadyaml은 이러한 이름을 가진 2 개의 클래스를 반환합니다.

user.yml에서 변환 된 사전

이 사전은 FactoryLoader.load ( ) 메서드를 사용하여 클래스를 생성합니다.

FactoryLoader (). load (yaml.load (open (path, “r”), Loader = yaml.FullLoader))

팩토리 로더 클래스의 목적

dictionaries items () 메서드 r 키-값 쌍을 포함하는 튜플 목록을 포함하는보기 개체를 반환합니다.

팩토리 로더가 제공된 테이블 및보기 스키마가 구성 용인지 아니면 작업용인지 여부를 스키마에있는 키를 통해 결정하는 방식입니다. . 예 : “ set “및 “ get ”키를 사용하면 구성 테이블이되고
rpc ”작업이됩니다. 표, “ 명령 “또는 “ title iv id =”bdc0565b95 “ item ” “ view “및”* “는 명령 테이블인지 여부도 나타냅니다.

user.yml “에는 ” set ”를 설정합니다. 따라서 \_item\_cfgtables 와 UserTable 키.

구성 유형 테이블에 대한 테이블 클래스를 생성하기위한 클래스 작성기 함수입니다.

Table 클래스는 View 클래스에 대한 참조를 보유하므로 테이블 섹션 아래에 정의 된 뷰가있는 경우 \_build\_view () 메서드를 사용하여 해당 뷰에 대한 클래스를 만들고 “ view “키의 값으로 클래스.

사전 get () 메소드는 키가없는 경우 기본값을 설정할 수 있습니다. , 여기에“ view\_name ”키가 없으므로 \_build\_view ( view\_name )는 클래스를 만들고 클래스를 view\_name 키. 또한 그룹, 평가, 필드를 추출하여 뷰 개체 내부 필드에 저장합니다.

먼저 컨테이너 CFGTABLE \_CFGTBL
\_CFGTBL = FactoryCfgTable

Python을 사용하면 “ type “메소드를 사용하여 동적 클래스 또는 유형을 만들려면.
type ”는 기존 개체에 전달되고 해당 유형을 반환합니다. 그러나 “ type “에 3 개의 인수가 전달되면 “ 클래스 이름 ”,“ bases 튜플 ”,“ dict ”그런 다음 새 클래스를 반환합니다.

vars “메서드도 있습니다.

\_\_ dict \_\_ 속성은 개체 쓰기 가능 속성을 저장합니다. Python은 메타 클래스를 사용하여 다른 클래스를 만듭니다.

우리는 새로운 클래스가 단일 튜플로 상속 할 클래스의 이름을 전달할 수 있습니다. 예 : new\_cls = type (table\_name, (CfgTable,), {})

set ”키워드가 표 섹션 아래에 있습니다.
예 : set : system / 로그인 / 사용자
구성 기본 클래스도 전달하여 UserTable 클래스를 만들어야합니다.
예 : new\_cls = type (table\_name, (CfgTable, Config), {})

수업에 자동으로 채워지는 필드

수업 시작 생성되면 factoryLoader 클래스의 카탈로그에 추가합니다. self.catalog [table\_name] = cls

이제 뷰 클래스 구성으로 이동합니다.

view\_name = tbl\_dict [“view “]
tbl\_dict [“view “] = self.catalog.get (view\_name, self.\_build\_view (view\_name))

view\_name < " user.yml “파일에 정의 된 / div>는 “입니다. userView ”.

마지막으로“ load ”은 FactoryLoader 클래스에서 생성 한 클래스 카탈로그를 반환합니다.

경로 요약 :

이것은 yml이 클래스로 변환 된 다음 작동하는 데 사용할 수있는 한 부분을 완료합니다. 다음으로 UserTable 클래스의 객체를 생성하는 것으로 시작합니다.

user\_table = UserTable (dev)

새로 생성 된 UserTable CfgTable 및 Config 기본 클래스의 경우 생성자와 해당 기본 클래스에 정의 된 모든 메서드를 상속합니다. 새 UserTable 개체를 생성하자마자 \_\_ init \_\_ . yml 파일에 “ set “가 언급되어 있으므로 config 생성자도 호출합니다. 기본 클래스입니다.

이후 iv id = “cb352886d2″에 대한 구성 데이터를 가져 오기위한 get () 메서드 >

system / login / user 계층.
먼저 namesonly = false 옵션을 확인합니다.

xpath 표현식의 계층 구조는 이미 set : system / login / user “user.yml”문. \_build\_xml 함수는이를 a로 변환합니다. XML은 아래와 같습니다.

사용자가 “ namekey “라고하는 특정 사용자 이름을 지정한 경우 위에서 생성 된 xml에 삽입합니다. 예를 들어 : get (user =”regress”)는 값 회귀가있는 이름 요소를 삽입합니다.

regress

모든 것이 get\_cmd에 압축되어 self.RPC.get\_config (get\_cmd)
일반적인 XML- RPC는 다음과 같습니다.

XML RPC 메서드 호출 XML 형식

사용자 정보 가져 오기를위한 XML은 다음과 같습니다.

이 XML-RPC는 HTTP POST 요청으로 변환되어 서버로 전송됩니다. XML RPC를 실행하고 결과를 XML 또는 네이티브 Python으로 반환합니다.

실제 rpc 호출은 ncclient의 rpc 메소드를 통해 수행됩니다. ssh를 통해 데이터가 암호화됩니다.

RPC 처리 rpc\_cmd\_e 입니다. ssh를 통한 netconf 구현을 제공하는 ncclient에 의해 수행됩니다. ncclient 패키지의 Manager () 개체에서 rpc 메서드가 실제로 정의 된 위치를 이해하기가 어려워집니다. ncclient 라이브러리를 조사한 결과 “rpc”= ExecuteRpc 및이 사전은 공급 업체별로 다릅니다. 자세히 알아 보려면 여기를 클릭하세요 .

사전에 이름을 지정하는이 전체 작업은 공급 업체에 따라 모든 연결 요청에 대해 생성되어 반환됩니다.

Junos 기기의 ssh too netconf 서버를 통해 전송 된 최종 XML RPC

빠른 netconf 세션 시작 및 교환 요약 :

클라이언트는 포트 830 서버는 즉시 HELLO 메시지를 보내야하며 클라이언트도 동일한 작업을 수행해야합니다. 전체 < hello > 메시지는 클라이언트와 서버의 기능을 지정합니다. 그런 다음 서버는 < rpc > 요청을 처리하기 위해 기다려야하며 < rpc-reply >. 클라이언트는 < rpc > 요소에 원하는만큼 XML 속성을 추가 할 수 있으며 서버는 < rpc-reply > 요소의 모든 속성을 반환합니다.

ok > 및 rpc-error > 태그는 오류 없음을 나타내는 태그입니다. 그런 다음 기기 / 공급 업체에 따라 다른 형식으로 변환되고 네임 스페이스 태그 등을 제거합니다.

응답은 마지막으로 아래와 같이 수신됩니다.

[( regress, [( user, regress), ( uid, 928), ( class\_name, superuser), ( password, abc123 @ # $ # $ ^)])]