Op 스크립트에서 RPC 및 운영 모드 명령을 사용하는 방법
대부분의 Junos OS 운영 모드 명령은 XML과 동등합니다. 운영 스크립트는 RPC( Remote Procedure Call ) 프로토콜을 사용하여 로컬 또는 원격 디바이스에서 이러한 XML 명령을 실행할 수 있습니다. XML과 동등한 모든 운영 모드 명령은 Junos XML API 운영 개발자 참조에 나열됩니다.
OP 스크립트에서 RPC 및 운영 모드 명령의 사용은 다음 섹션에서 자세히 설명합니다.
Op 스크립트에서 RPC 사용
SLAX 또는 XSLT op 스크립트에서 RPC를 사용하려면, RPC를 변수 선언에 포함시키고, RPC 변수가 있는 확장 기능을 인수로 사용하여 jcs:invoke()
jcs:execute()
RPC를 호출합니다. 이 jcs:invoke()
기능은 로컬 디바이스에서 RPC를 실행합니다. 이 jcs:execute()
기능은 연결 핸들과 함께 원격 디바이스에서 RPC를 실행합니다.
로컬 디바이스에서 RPC를 호출하는 다음 snippet이 확장되고 완벽하게 설명됩니다 . 예제: Show 인터페이스의 출력 사용자 정의 운영 스크립트를 사용한 terse 명령:
XSLT 구문
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
SLAX 구문
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
다음 스니펫은 원격 디바이스에서 동일한 RPC를 호출합니다.
XSLT 구문
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
SLAX 구문
var $rpc = <get-interface-information>; var $connection = jcs:open('198.51.100.1', 'bsmith', 'test123'); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection);
Python op 스크립트에서 RPC는 Junos PyEZ API 를 사용하여 쉽게 실행할 수 있습니다. Junos PyEZ Device
클래스의 각 인스턴스에는 rpc
Junos XML API를 통해 사용 가능한 모든 RPC를 실행할 수 있는 속성이 있습니다. 로컬 또는 원격 디바이스로 세션을 설정한 후 디바이스 인스턴스에 속성 및 RPC 메소드 이름을 추가하여 rpc
RPC를 실행할 수 있습니다. 반환 값은 태그의 <rpc-reply>
첫 번째 요소에서 시작하는 XML 객체입니다.
로컬 디바이스에서 RPC를 실행하려면 빈 인수 목록을 사용하여 인스턴스를 만듭니다 Device
. 원격 디바이스에서 RPC를 실행하려면 해당 인수를 사용하여 해당 디바이스에 연결하는 인스턴스 Device
를 생성합니다.
다음 코드는 로컬 디바이스에서 RPC를 호출하고 회신을 인쇄합니다.
Python 구문
from jnpr.junos import Device from lxml import etree with Device() as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
다음 코드는 원격 디바이스에서 동일한 RPC를 호출하고 회신을 인쇄합니다.
Python 구문
from jnpr.junos import Device from lxml import etree import jcs user = jcs.get_input('Enter username: ') password = jcs.get_secret('Enter user password: ') with Device(host='198.51.100.1', user=user, password=password) as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
원격 디바이스에서 RPC를 실행하려면 SSH 세션이 설정되어야 합니다. 스크립트가 연결을 설정하려면, 스크립트가 실행될 로컬 장비의 원격 장비에 대한 SSH 호스트 키 정보를 구성하거나, 원격 장비에 대한 SSH 호스트 키 정보는 스크립트를 실행하는 사용자의 알려진 호스트 파일에 있어야 합니다. RPC가 실행되는 각 원격 디바이스의 경우 다음 방법 중 하나로 SSH 호스트 키 정보를 구성합니다.
로컬 디바이스에서 SSH 알려진 호스트를 구성하려면 명령문을 포함하고
host
구성의 계층 수준에서 원격 장비[edit security ssh-known-hosts]
에 대한 호스트 이름 및 호스트 키 옵션을 지정합니다.SSH 호스트 키 정보를 수동으로 검색하려면 구성 모드 명령을 실행
set security ssh-known-hosts fetch-from-server hostname
하여 Junos OS가 원격 디바이스에 연결하고 키를 추가하도록 지시합니다.user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
파일에서 SSH 호스트 키 정보를 수동으로 임포트하려면 구성 모드 명령을 사용하고
set security ssh-known-hosts load-key-file filename
알려진 호스트 파일을 지정합니다.user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
또는 스크립트를 실행하는 사용자가 로컬 장치, 원격 장비에 SSH에 로그인한 다음 사용자의 알려진 호스트 파일에 추가된 호스트 키를 수동으로 수락할 수 있습니다. 다음 예에서는 루트가 Router1에 로그인됩니다. 라우터2에서 원격 RPC를 실행하기 위해 루트는 운영 모드 명령을 발행
ssh router2
하고 키를 수동으로 수락함으로써 라우터2의 호스트 키를 추가합니다.root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
명령용 RPC 태그 표시
디바이스의 CLI에서 운영 모드 명령에 대한 RPC XML 태그를 표시할 수 있습니다. 명령에 대한 RPC XML 태그를 표시하려면 파이프 기호(|)를 따라 입력 display xml rpc
합니다.
다음 예제에서는 명령에 대한 RPC 태그를 show route
표시합니다.
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
SLAX 및 XSLT 스크립트는 RPC XML 태그를 사용하여 RPC를 실행할 수 있습니다. Python 스크립트는 RPC 태그와 명령 옵션을 Python에 적합한 형식으로 변환해야 합니다. JUNOS PyEZ를 사용하여 RPC를 실행하고 해당 Python 메소드 및 메소드 인수에 RPC 태그를 매핑하는 방법에 대한 자세한 내용은 Junos PyEZ를 사용하여 Junos OS를 실행하는 장치에서 RPC를 실행하는 것을 참조하십시오.
Op 스크립트에서 운영 모드 명령 사용
일부 운영 모드 명령에는 XML 등가물이 없습니다. SLAX 및 XSLT 스크립트는 요소를 사용하여 <command>
XML과 동등한 명령어 없이 실행할 수 있습니다. Python 스크립트는 클래스에서 정의된 Device
Junos PyEZ cli()
메소드를 사용하여 이러한 명령을 실행할 수 있습니다.
명령이 Junos XML API 운영 개발자 참조에 나열되지 않으면 명령어에 동등한 XML이 없습니다. 명령이 XML과 동등한지 여부를 결정하는 또 다른 방법은 다음과 같은 명령 뒤에 있는 명령을 발행하는 | display xml
것입니다.
user@host> operational-mode-command | display xml
출력에 , <cli>
, 등의 태그 요소<output>
만 포함하며 <banner>
명령어에 XML과 동등한 요소가 없을 수 있습니다. 다음 예에서 출력은 명령어에 동등한 XML이 없음을 show host
나타냅니다.
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
XML과 동등한 일부 명령의 경우, 파이프 명령 | display xml
의 출력은 해당 기능이 구성되지 않았기 때문에 이 <cli>
<banner>
외<output>
의 태그 요소를 포함하지 않습니다. 예를 들어 명령 show services cos statistics forwarding-class
어는 응답 태그에서 <service-cos-forwarding-class-statistics>
출력을 반환하는 XML 동급을 가지고 있지만, 컨피규레이션이 계층 수준에 있는 어떤 명령문 [edit class-of-service]
도 포함하지 않으면 명령어에 표시할 실제 데이터가 show services cos statistics forwarding-class | display xml
없습니다. 출력은 이와 유사합니다.
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
이러한 이유로 Junos XML API 운영 개발자 참조 의 정보는 일반적으로 더 안정적입니다.
SLAX 및 XSLT op 스크립트에는 XML과 동등한 명령이 포함될 수 있습니다. <command>
<xsl:value-of>
다음 코드 조각에 표시된 대로 스크립트의 , 및 <output>
요소를 사용합니다. 이 스니펫은 확장되어 예: Op 스크립트를 사용하여 DNS 호스트 이름 정보를 표시합니다.
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Python op 스크립트는 Junos PyEZ API를 사용하여 XML에 상응하는 명령어 없이 실행할 수 있습니다. cli()
클래스에서 Device
정의된 방법은 작업 모드 명령을 실행하고 출력을 텍스트 형식으로 반환합니다. 예를 들어:
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
Junos OS XML 요소로 형식화된 출력을 반환하도록 지정할 format='xml'
수도 있습니다. Junos PyEZ cli()
방법에 대한 자세한 내용은 http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli 를 참조하십시오.