Junos PyEZ를 사용하여 Junos 디바이스에서 RPC 실행
요약 Device
rpc
속성을 사용하여 Junos 디바이스에서 운영 RPC를 실행할 수 있습니다.
Junos PyEZ를 사용하여 Junos 디바이스에서 온디맨드 방식으로 원격 프로시저 호출(RPC)을 실행할 수 있습니다. 클래스의 인스턴스를 Device
생성한 후 RPC를 인스턴스의 속성 Device
으로 실행할 수 있습니다. CLI에서 실행할 수 있는 것과 동일한 운영 명령을 Junos PyEZ를 사용하여 수행할 수 있습니다.
Junos XML API는 Junos OS 구성 명령문 및 운영 모드 명령의 XML 표현입니다. 이는 Junos OS 구성 계층의 모든 문과 CLI 운영 모드에서 실행하는 많은 명령에 대해 동일한 XML을 정의합니다. Junos XML이 있는 각 운영 모드 명령은 요청 태그 요소와 필요한 경우 응답 태그 요소에 매핑됩니다. 요청 태그는 NETCONF 또는 Junos XML 프로토콜 세션 내의 RPC에서 Junos 디바이스에서 정보를 요청하는 데 사용됩니다. 서버는 response 태그 요소 내에 포함된 Junos XML 요소를 사용하여 응답을 반환합니다.
Junos PyEZ를 사용하여 RPC를 실행할 때 요청 태그 이름을 메서드 이름에 매핑합니다. 이 주제는 CLI 명령을 Junos PyEZ RPC에 매핑하는 방법, Junos PyEZ를 사용하여 RPC를 실행하는 방법, RPC 응답에서 반환되는 데이터를 사용자 지정하는 방법을 간략하게 설명합니다.
Junos OS 명령을 Junos PyEZ RPC에 매핑
Junos XML에 대응하는 모든 운영 명령은 Junos XML API 탐색기에 나열됩니다. 또한 CLI 또는 Junos PyEZ를 사용하여 Junos XML에 대응하는 모든 운영 모드 명령에 대해 Junos XML 요청 태그 요소를 표시할 수 있습니다. 요청 태그를 얻은 후에는 Junos PyEZ RPC 메서드 이름에 매핑할 수 있습니다.
CLI에서 명령에 대한 Junos XML 요청 태그를 표시하려면 명령 다음에 옵션을 포함합니다| display xml rpc
. 다음 예제에서는 명령에 대한 요청 태그를 표시합니다.show route
user@router> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/15.1R1/junos"> <rpc> <get-route-information> </get-route-information> </rpc> </rpc-reply>
Junos PyEZ를 사용하여 명령에 대한 Junos XML 요청 태그를 표시할 수도 있습니다. 요청 태그를 표시하려면 instance display_xml_rpc()
메서드를 호출 Device
하고 명령 문자열 및 format='text'
를 인수로 포함합니다. 예를 들어:
from jnpr.junos import Device with Device(host='router.example.com') as dev: print (dev.display_xml_rpc('show route', format='text'))
프로그램을 실행하면 명령에 대한 요청 태그가 show route
반환됩니다.
<get-route-information> </get-route-information>
운영 명령에 대한 요청 태그를 Junos PyEZ RPC 메서드 이름에 매핑할 수 있습니다. RPC 메서드 이름을 파생하려면 요청 태그의 하이픈을 밑줄(_)로 바꾸고 바깥쪽 꺾쇠 괄호를 제거합니다. 예를 들어 요청 태그는 <get-route-information>
메서드 이름에 매핑됩니다 get_route_information()
.
RPC를 디바이스 인스턴스의 속성으로 실행
의 Device
각 인스턴스에는 Junos XML API를 rpc
통해 사용 가능한 모든 RPC를 실행할 수 있는 속성이 있습니다. Junos PyEZ 애플리케이션에서 디바이스와의 연결을 설정한 후 다음 예제와 같이 디바이스 인스턴스에 속성 및 RPC 메서드 이름을 추가하여 rpc
RPC를 실행할 수 있습니다.
from jnpr.junos import Device from lxml import etree with Device(host='dc1a.example.com') as dev: #invoke the RPC equivalent to "show version" sw = dev.rpc.get_software_information() print(etree.tostring(sw, encoding='unicode'))
반환 값은 태그 아래의 첫 번째 요소에서 시작하는 XML 객체입니다 <rpc-reply>
. 이 경우 RPC는 get_software_information()
<software-information>
요소를 반환합니다.
<software-information> <host-name>dc1a</host-name> ... </software-information>
Junos OS 명령에는 값이 없는 고정 형식 옵션이 있을 수 있습니다. 예를 들어, 명령에 해당하는 show interfaces terse
Junos XML은 이( terse
가) 빈 요소임을 나타냅니다.
user@router> show interfaces terse | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/14.1R1/junos"> <rpc> <get-interface-information> <terse/> </get-interface-information> </rpc> </rpc-reply>
RPC를 실행하고 값을 사용하지 않는 명령 옵션을 포함하려면 RPC 메서드의 인수 목록에 옵션을 추가하고 옵션 이름의 대시를 밑줄로 변경한 다음 True로 설정합니다. 다음 코드는 명령과 동일한 Junos PyEZ RPC를 실행합니다.show interfaces terse
rsp = dev.rpc.get_interface_information(terse=True)
Junos OS 명령에는 값이 필요한 옵션도 있을 수 있습니다. 예를 들어, 다음 출력 interface-name
에서 요소에는 정보를 반환하려는 인터페이스의 이름인 값이 필요합니다.
user@router> show interfaces ge-0/0/0 | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/14.1R1/junos"> <rpc> <get-interface-information> <interface-name>ge-0/0/0</interface-name> </get-interface-information> </rpc> </rpc-reply>
RPC를 실행하고 값이 필요한 명령 옵션을 포함하려면 RPC 메서드의 인수 목록에 옵션을 추가하고 옵션 이름의 대시를 밑줄로 변경한 다음 적절한 값과 동일하게 설정합니다. 다음 예제에서는 명령과 동일한 Junos PyEZ RPC를 실행합니다.show interfaces ge-0/0/0
rsp = dev.rpc.get_interface_information(interface_name='ge-0/0/0')
RPC 출력의 형식 지정
기본적으로 RPC 반환 값은 태그 아래의 첫 번째 요소에서 시작하는 XML 객체입니다<rpc-reply>
. 또는 {'format':'json'}
사전을 RPC 메서드의 첫 번째 인수로 포함하여 {'format':'text'}
RPC 출력을 텍스트 또는 JSON(JavaScript Object Notation) 형식으로 반환할 수도 있습니다.
JSON 형식의 RPC 출력은 Junos OS 릴리스 14.2R1부터 지원됩니다.
다음 예는 RPC의 get_software_information()
출력을 텍스트 형식으로 반환하며, 이는 RPC 출력이 요소 내에 <output>
포함된다는 점을 제외하고 CLI의 명령에 대해 show version
내보낸 출력과 동일합니다.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.com') as dev: sw_info_text = dev.rpc.get_software_information({'format':'text'}) print(etree.tostring(sw_info_text))
user@server:~$ python3 junos-pyez-rpc-text-format.py <output> Hostname: router1 Model: mx104 Junos: 18.3R1.9 JUNOS Base OS boot [18.3R1.9] JUNOS Base OS Software Suite [18.3R1.9] JUNOS Crypto Software Suite [18.3R1.9] JUNOS Packet Forwarding Engine Support (TRIO) [18.3R1.9] JUNOS Web Management [18.3R1.9] JUNOS Online Documentation [18.3R1.9] JUNOS SDN Software Suite [18.3R1.9] JUNOS Services Application Level Gateways [18.3R1.9] JUNOS Services COS [18.3R1.9] JUNOS Services Jflow Container package [18.3R1.9] JUNOS Services Stateful Firewall [18.3R1.9] JUNOS Services NAT [18.3R1.9] JUNOS Services RPM [18.3R1.9] JUNOS Services Captive Portal and Content Delivery Container package [18.3R1.9] JUNOS Macsec Software Suite [18.3R1.9] JUNOS Services Crypto [18.3R1.9] JUNOS Services IPSec [18.3R1.9] JUNOS DP Crypto Software Software Suite [18.3R1.9] JUNOS py-base-powerpc [18.3R1.9] JUNOS py-extensions-powerpc [18.3R1.9] JUNOS jsd [powerpc-18.3R1.9-jet-1] JUNOS Kernel Software Suite [18.3R1.9] JUNOS Routing Software Suite [18.3R1.9] <output>
다음 예제에서는 RPC의 get_software_information()
출력을 JSON 형식으로 반환합니다.
from jnpr.junos import Device from pprint import pprint with Device(host='router1.example.com') as dev: sw_info_json = dev.rpc.get_software_information({'format':'json'}) pprint(sw_info_json)
user@server:~$ python3 junos-pyez-rpc-json-format.py {u'software-information': [{u'host-name': [{u'data': u'router1'}], u'junos-version': [{u'data': u'18.3R1.9'}], u'package-information': [{u'comment': [{u'data': u'JUNOS Base OS boot [18.3R1.9]'}], u'name': [{u'data': u'junos'}]}, {u'comment': [{u'data': u'JUNOS Base OS Software Suite [18.3R1.9]'}], u'name': [{u'data': u'jbase'}]}, ...
반환할 데이터 범위 지정
Junos PyEZ를 사용하여 RPC를 실행하여 Junos 디바이스에서 운영 정보를 검색할 수 있습니다. Junos PyEZ 릴리스 2.3.0부터 XML 출력을 요청할 때 응답을 필터링하여 특정 요소만 반환할 수 있습니다. 출력을 필터링하면 광범위한 운영 출력이 있는 경우에 유용하지만 데이터의 하위 집합만 사용하면 됩니다.
특정 태그만 반환하도록 RPC 회신을 필터링하려면 RPC 메서드의 인수를 filter_xml
포함합니다. filter_xml
매개 변수는 반환할 요소를 선택하는 하위 트리 필터가 포함된 문자열을 사용합니다. 하위 트리 필터는 선택 기준과 일치하는 데이터를 반환합니다.
다음 Junos PyEZ 예제는 RPC를 <get-interface-information>
실행하고 출력을 필터링하여 응답의 각 <physical-interface>
요소에 대한 요소만 <name>
검색합니다.
from jnpr.junos import Device from lxml import etree with Device(host='router.example.com', use_filter=True) as dev: filter = '<interface-information><physical-interface><name/></physical-interface></interface-information>' result = dev.rpc.get_interface_information(filter_xml=filter) print (etree.tostring(result, encoding='unicode'))
스크립트를 실행하면 각 물리적 인터페이스의 name 요소가 표시됩니다.
user@server:~$ python3 junos-pyez-get-interface-names.py <interface-information style="normal"><physical-interface><name> lc-0/0/0 </name></physical-interface><physical-interface><name> pfe-0/0/0 </name></physical-interface><physical-interface><name> pfh-0/0/0 </name></physical-interface><physical-interface><name> xe-0/0/0 </name></physical-interface><physical-interface><name> xe-0/1/0 </name></physical-interface><physical-interface><name> ge-1/0/0 </name></physical-interface> ... </interface-information>
RPC 시간 제한 지정
RPC 실행 시간은 RPC와 디바이스에 따라 크게 달라질 수 있습니다. 기본적으로 NETCONF RPC는 30초 후에 시간 초과됩니다. RPC를 실행할 때 인수를 dev_timeout=seconds
포함하여 RPC가 실행 중에 시간 초과되지 않도록 하여 시간 제한 값을 확장할 수 있습니다. dev_timeout
는 해당 단일 RPC 작업에 대해서만 디바이스 시간 제한을 조정합니다.
dev.rpc.get_route_information(table='inet.0', dev_timeout=55)
XML RPC 회신 정규화
RPC를 실행할 때 RPC 응답에는 줄 바꿈으로 래핑되거나 다른 불필요한 공백을 포함하는 데이터가 포함될 수 있습니다. 불필요한 공백으로 인해 XML을 구문 분석하고 텍스트 기반 검색을 사용하여 정보를 찾기가 어려울 수 있습니다. 모든 선행 및 후행 공백을 제거하고 내부 공백 문자 시퀀스를 단일 공백으로 바꾸는 RPC 응답을 정규화할 수 있습니다.
표 1 은 기본 RPC 응답을 정규화된 버전과 비교합니다. 기본 RPC 응답에는 정규화된 응답에 없는 많은 줄 바꿈이 포함됩니다.
기본 RPC 회신 |
정규화된 RPC 회신 |
---|---|
<interface-information style="terse"> <logical-interface> <name>\nge-0/0/0.0\n</name> <admin-status>\nup\n</admin-status> <oper-status>\nup\n</oper-status> <filter-information>\n</filter-information> <address-family> <address-family-name>\ninet\n</address-family-name> <interface-address> <ifa-local emit="emit">\n198.51.100.1/24\n</ifa-local> </interface-address> </address-family> </logical-interface> </interface-information> |
<interface-information style="terse"> <logical-interface> <name>ge-0/0/0.0</name> <admin-status>up</admin-status> <oper-status>up</oper-status> <filter-information/> <address-family> <address-family-name>inet</address-family-name> <interface-address> <ifa-local emit="emit">198.51.100.1/24</ifa-local> </interface-address> </address-family> </logical-interface> </interface-information> |
디바이스와의 세션 기간 동안 표준화를 활성화하거나 RPC를 실행할 때 개별 RPC 응답을 정규화할 수 있습니다. 전체 디바이스 세션에 대해 표준화를 활성화하려면 디바이스 인스턴스를 생성할 때 또는 메서드를 사용하여 디바이스에 연결할 때 인수 목록에 포함시킵니다 normalize=True
open()
.
dev = Device(host='router1.example.com', user='root', normalize=True) # or dev.open(normalize=True)
개별 RPC 응답을 정규화하려면 해당 RPC 메서드의 인수 목록에 포함합니다 normalize=True
.
dev.rpc.rpc_method(normalize=True)
예를 들어:
rsp = dev.rpc.get_interface_information(interface_name='ge-0/0/0.0', terse=True, normalize=True)
RPC 응답을 정규화하지 않는 경우, 특정 노드 또는 값을 참조하는 XPath 표현식을 사용할 때 공백을 고려해야 합니다. 다음 예제에서는 논리적 인터페이스의 IPv4 주소를 선택합니다. XPath 표현식에서 패밀리를 inet
지정하는 술어는 검색이 성공하기 위해 추가 공백을 고려해야 합니다. 결과 값에는 선행 및 후행 줄 바꿈이 포함됩니다.
rsp = dev.rpc.get_interface_information(interface_name='ge-0/0/0.0', terse=True) print (rsp.xpath('.// \ address-family[normalize-space(address-family-name)="inet"]/ \ interface-address/ifa-local')[0].text)
'\n198.51.100.1/24\n'
RPC 회신을 정규화하면 선행 및 후행 공백이 제거되어 텍스트 기반 검색이 훨씬 더 간단해집니다.
rsp = dev.rpc.get_interface_information(interface_name='ge-0/0/0.0', terse=True, normalize=True) print (rsp.xpath('.//address-family[address-family-name="inet"]/ \ interface-address/ifa-local')[0].text)
'198.51.100.1/24'