Junos 디바이스에서 YANG RPC를 위한 작업 스크립트 생성
지원되는 Junos 디바이스에서 맞춤형 RPC(Remote Procedure Call)를 정의하는 YANG 데이터 모델을 추가할 수 있습니다. 비연결 YANG RPC를 디바이스에 추가하면 RPC의 처리기 역할을 하는 작업 스크립트도 제공해야 합니다. RPC 정의는 RPC가 실행될 때 호출되는 작업 스크립트를 참조합니다. 작업 스크립트는 작업을 수행하고 RPC에 필요한 정보를 검색하고 RPC output
문에 정의된 필수 XML 출력 요소를 반환합니다.
작업 스크립트는 SLAX(Stylesheet Language Alternative SyntaX) 또는 Python으로 작성할 수 있습니다. SLAX 작업 스크립트는 SLAX op 스크립트와 유사하며 Junos XML 관리 프로토콜 및 Junos XML API가 지원하는 RPC를 통해 사용할 수 있는 모든 기능을 수행할 수 있습니다. Python 작업 스크립트는 Python 언어의 모든 기능과 구조를 활용할 수 있으며, SLAX 스크립트에 비해 유연성이 향상됩니다. 또한 Python 작업 스크립트는 JUNOS PyEZ API 를 지원하여 RPC를 쉽게 실행하고 Junos 디바이스에서 운영 및 구성 작업을 수행할 수 있습니다. Python 스크립트는 XPath 처리를 간소화하는 라이브러리를 활용할 lxml
수도 있습니다. 또한 Junos OS 릴리스 19.3R1부터 Python 작업 스크립트에서 IPv6를 사용한 업그레이드된 FreeBSD 지원과 Junos OS를 실행하는 디바이스도 있습니다.
이 주제는 RPC 입력 인수를 구문 분석하고, 스크립트의 운영 및 구성 데이터에 액세스하고, XML 출력을 내보내고, 장비에서 스크립트를 검증하고 로드하는 방법을 포함하여 작업 스크립트를 만드는 방법에 대해 설명합니다.
작업 스크립트 상용구
SLAX 스크립트 상용구
SLAX 작업 스크립트에는 기본 스크립트 기능에 필요한 상용 표준뿐만 아니라 Junos OS 확장 기능 및 명명된 템플릿과 같은 스크립트 내에서 사용되는 옵션 기능이 포함되어야 합니다. 또한 스크립트는 명령문을 사용하여 param
모든 RPC 입력 매개변수를 선언해야 합니다. SLAX 작업 스크립트 표준은 다음과 같습니다.
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "/var/db/scripts/import/junos.xsl"; param $input-param1; param $input-param2; match / { <action-script-results> { /* insert your code here */ } }
Python 스크립트 보일러플레이트
Python 작업 스크립트는 스크립트를 실행하는 데 사용되는 Python 버전을 지정하는 해석기 지시줄을 포함해야 합니다. 표 1 은 다양한 릴리스에서 사용할 수 있는 해석 지시어 라인을 개략적으로 설명합니다.
Python 버전 | Interpreter Directive Lines | 지원 릴리스 |
---|---|---|
Python 3 |
|
Junos OS 릴리스 20.2R1 이상 Junos OS Evolved 릴리스 21.1R1 이상 |
Python 2.7 |
|
Junos OS 릴리스 20.1 이전 버전 Junos OS Evolved Release 22.2 이전 버전 |
Junos OS 릴리스 20.2R1 및 Junos OS Evolved Release 22.3R1부터 이 디바이스는 Python 3을 사용하여 YANG 작업 및 변환 스크립트를 실행합니다. 이전 릴리스에서 Junos OS는 Python 2.7만 사용하여 이러한 스크립트를 실행하며, Junos OS Evolved는 기본적으로 Python 2.7을 사용하여 스크립트를 실행합니다.
또한 Python 작업 스크립트는 스크립트에서 사용되는 라이브러리, 모듈 또는 객체를 임포트해야 합니다. 예를 들어 표준 Python 라이브러리 외에도 Python 작업 스크립트는 다음을 가져올 수 있습니다.
-
jcs
라이브러리—스크립트에서 Junos OS 확장 기능 과 Junos OS 명명된 템플릿 기능을 사용할 수 있도록 합니다. -
jnpr.junos
모듈 및 클래스—스크립트가 Junos PyEZ를 사용할 수 있도록 지원합니다. -
lxml
라이브러리—XPath 처리를 간소화합니다.
예를 들어:
#!/usr/bin/python3 import jcs from jnpr.junos import Device from lxml import etree
RPC 입력 인수 구문 분석
입력 인수 개요
RPC는 옵션 input
명령문을 사용하여 입력 매개변수를 정의할 수 있습니다. RPC를 실행하고 입력 인수를 제공하면 Junos OS는 RPC의 작업 스크립트를 호출하고 해당 인수를 스크립트에 전달합니다. Python 또는 SLAX 작업 스크립트에서는 일반 Python 스크립트 또는 Junos OS SLAX 운영 스크립트의 명령줄 인수에 각각 액세스하는 것과 동일한 방식으로 RPC 입력 인수에 액세스할 수 있습니다.
RPC에 대한 get-host-status
다음 input
내용을 고려하십시오.
rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-host-status.py"; } } input { leaf hostip { description "IP address of the target host"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } leaf test { description "empty argument"; type empty; } } ...
RPC는 CLI 또는 NETCONF 또는 Junos XML 프로토콜 세션을 통해 실행할 수 있습니다. 예를 들어 CLI에서 다음 명령을 실행할 수 있습니다.
user@host> show host-status hostip 198.51.100.1 level detail test
마찬가지로 원격 세션에서 다음 RPC를 실행할 수도 있습니다.
<rpc> <get-host-status> <hostip>198.51.100.1</hostip> <level>detail</level> <test/> </get-host-status> </rpc>
명령 또는 RPC를 실행하면 디바이스가 작업 스크립트를 호출하고 인수를 통과합니다. 다음 섹션에서는 SLAX 또는 Python 작업 스크립트에서 인수를 처리하는 방법에 대해 설명합니다.
Junos OS 릴리스 19.2R1부터 맞춤형 YANG RPC는 Junos OS CLI에서 RPC 명령을 실행할 때 유형 empty
입력 매개 변수를 지원하며 작업 스크립트에 전달된 값은 매개 변수 이름입니다. 이전 릴리스에서 유형 empty
입력 매개 변수는 NETCONF 또는 Junos XML 프로토콜 세션에서 RPC를 실행할 때만 지원되며 작업 스크립트에 전달된 값은 문자열 'none'
입니다.
SLAX 스크립트 입력 인수
SLAX 작업 스크립트에서는 명령문을 사용하여 param
입력 매개변수를 선언해야 합니다. 매개 변수 이름은 YANG 모듈에 정의된 매개 변수 이름과 동일해야 합니다.
호출될 때 스크립트는 각 인수에 대한 값을 해당 매개 변수에 할당하며, 이 매개 변수는 스크립트 전체에서 참조할 수 있습니다. 매개 변수를 선언할 때와 해당 값에 액세스할 때 모두 달러 기호($) 기호를 포함해야 합니다. 매개 변수가 유형 empty
이면 매개 변수 이름이 해당 값으로 전달됩니다.
param $hostip; param $level; param $test;
SLAX 매개변수에 대한 자세한 내용은 자동화 스크립팅 사용자 가이드의 SLAX 매개변수 개요를 참조하십시오.
Python 스크립트 입력 인수
Python 작업 스크립트의 경우 인자는 다음과 같이 스크립트로 전달됩니다.
-
첫 번째 주장은 항상 작업 스크립트의 파일 경로입니다.
-
목록의 다음 인수는 사용자가 제공하는 각 입력 매개 변수에 대한 이름과 값입니다.
인수 이름은 다음과 같이 전달됩니다.
-
Junos OS Release 21.1 이전 버전에서 디바이스는 인수의 이름으로 전달됩니다.
-
Junos OS Release 21.2R1 이상에서 디바이스는 단일 하이픈(-)을 단일 문자 인수 이름에 접두사하고 2개의 하이픈(--)을 다중 문자 인수 이름에 접두사합니다.
참고:CLI에서 RPC 명령을 실행하면 명령줄에서 지정한 순서대로 인수가 스크립트로 전달됩니다. NETCONF 또는 Junos XML 프로토콜 세션에서 XML의 인수 순서는 임의적이므로 인수가 RPC
input
명령문에 선언된 순서대로 인수가 스크립트로 전달됩니다. -
-
사용자가 아닌 시스템에서 제공하는 목록의 마지막 두 인수는 RPC의 이름입니다
'rpc_name'
.
다음 섹션에서는 여러 릴리스의 Python 작업 스크립트에 전달된 인수를 처리하는 방법에 대해 설명합니다.
Python 작업 스크립트(21.2R1 이상)
Junos OS Release 21.2R1 및 Junos OS Evolved Release 21.2R1부터 디바이스가 Python 작업 스크립트에 입력 인수 이름을 전달하면 단일 하이픈(-)을 단일 문자 인수 이름에 접두사하고 2개의 하이픈(--)을 다중 문자 인수 이름에 접두사합니다. 이를 통해 표준 명령줄 파싱 라이브러리를 사용하여 인수를 처리할 수 있습니다.
이전 YANG RPC 예에서 작업 스크립트의 sys.argv
입력 인수 목록은 다음과 같습니다.
['/var/db/scripts/action/rpc-host-status.py', '--hostip', '198.51.100.1', '--level', 'detail', '--test', 'test', '--rpc_name', 'get-host-status']
다음 샘플 Python 코드는 라이브러리를 argparse
사용하여 인수를 처리합니다. 이 경우 구문 분석기는 시스템이 스크립트에 rpc_name
전달한다는 주장도 고려해야 합니다.
#!/usr/bin/python3 import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--hostip', required=True) parser.add_argument('--level', required=False, default='brief') parser.add_argument('--test', required=False) parser.add_argument('--rpc_name', required=True) args = parser.parse_args() # access argument values by using args.hostip, args.level, and args.test
Python 작업 스크립트(21.1 이상)
Junos OS Release 21.1 이전 버전에서 디바이스는 입력 인수 이름을 명령 또는 RPC에 제공된 것과 똑같이 Python 작업 스크립트에 전달합니다. 목록을 통해 입력 인수에 sys.argv
액세스할 수 있습니다.
이전 YANG RPC 예에서 작업 스크립트의 sys.argv
입력 인수 목록은 다음과 같습니다.
['/var/db/scripts/action/rpc-host-status.py', 'hostip', '198.51.100.1', 'level', 'detail', 'test', 'test', 'rpc_name', 'get-host-status']
다음 샘플 Python 코드는 RPC 예제 목록에서 각 인수 sys.arv
에 대한 값을 추출하는 한 가지 방법을 보여줍니다. 예제에서는 먼저 가능한 인수 이름을 키로 포함하고 각 인수의 기본값을 포함하는 사전을 정의합니다. 그런 다음 코드는 목록의 sys.argv
각 키를 검사하고 있는 경우 목록의 인수 이름 인덱스를 검색합니다. 코드는 인접 인덱스 위치에서 인수의 값을 추출하고 적절한 키를 위해 딕셔닝에 저장합니다. 이 방법은 실행 중에 인수가 다른 순서로 스크립트에 전달되면 지정된 인수에 대해 올바른 값을 검색합니다.
import sys # Define default values for arguments args = {'hostip': None, 'level': 'brief', 'test': None} # Retrieve user input and store the values in the args dictionary for arg in args.keys(): if arg in sys.argv: index = sys.argv.index(arg) args[arg] = sys.argv[index+1]
운영 및 구성 데이터 검색
작업 스크립트는 Junos OS를 실행하는 디바이스에서 운영 및 구성 데이터를 검색한 다음 필요한 정보를 위해 데이터를 구문 분석할 수 있습니다. SLAX 작업 스크립트는 Junos XML 관리 프로토콜과 Junos XML API가 지원하는 RPC를 실행하여 장비에서 정보를 검색할 수 있습니다. Python 작업 스크립트는 Junos PyEZ API를 사용하거나 cli -c 'command'
셸에서와 마찬가지로 작업 스크립트에서 CLI 명령을 실행하는 방식으로 운영 및 구성 정보를 검색할 수 있습니다. 메소드를 통해 cli -c
운영 정보를 검색하려면 원하는 운영 명령을 포함합니다. 구성 정보를 검색하려면 명령을 사용합니다 show configuration
.
다음 SLAX snippet은 동등한 <get-interface-information>
요청 태그를 사용하여 로컬 장비에서 명령을 실행합니다show interfaces
.
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc); /* parse for relevant information and return as XML tree for RPC output */
다음 Python 코드는 Junos PyEZ를 사용하여 CLI 명령과 동일한 RPC를 show interfaces
실행 get_interface_information
합니다.
#!/usr/bin/python3 from jnpr.junos import Device from lxml import etree with Device() as dev: res = dev.rpc.get_interface_information() # parse for relevant information and return as XML tree for RPC output
Junos OS를 실행하는 디바이스에서 Junos PyEZ를 사용하여 RPC를 실행하는 경우 Junos PyEZ를 사용하여 Junos OS를 실행하는 디바이스에서 RPC를 실행하는 방법을 참조하십시오.
다음 Python 코드는 명령을 실행하고 show interfaces | display xml
문자열 출력을 XPath 구조를 사용하여 필요한 데이터에 대해 구문 분석할 수 있는 XML 트리로 변환합니다.
#!/usr/bin/python3 import subprocess from lxml import etree cmd = ['cli', '-c', 'show interfaces | display xml'] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) tmp = proc.stdout.read() root = etree.fromstring(tmp.strip()) # parse for relevant information and return as XML tree for RPC output
RPC XML 출력 방출
RPC는 옵션 output
명령문을 사용하여 출력 요소를 정의할 수 있습니다. 작업 스크립트는 RPC 출력에 필요한 XML 요소를 정의하고 내보내야 합니다. 스크립트에서 방출되는 XML 계층은 RPC output
명령문 정의에 컨테이너 및 리프 명령문에 의해 정의된 트리를 반영해야 합니다. XML 출력을 반환하려면 작업 스크립트가 RPC 출력 계층과 출력 계층만 내보내야 합니다. SLAX 스크립트는 XML을 내보내기 위해 명령문을 사용해야 copy-of
하며 Python 스크립트는 명령문을 사용할 print
수 있습니다.
예를 들어, 다음 YANG RPC output
명령문을 고려하십시오.
output { container host-status-information { container host-status-info { leaf host { type string; description "Host IP"; } leaf status { type string; description "Host status"; } leaf date { type string; description "Date and time"; } } } }
작업 스크립트는 예를 들어 해당 XML 출력을 생성하고 내보내야 합니다.
<host-status-information> <host-status-info> <host>198.51.100.1</host> <status>Active</status> <date>2016-10-10</date> </host-status-info> <host-status-info> <host>198.51.100.2</host> <status>Inactive</status> <date>2016-10-10</date> </host-status-info> </host-status-information>
필요한 출력 요소에 대한 값을 검색한 후 Python 스크립트는 다음 코드를 사용하여 XML 출력 계층을 방출할 수 있습니다.
from lxml import etree ... xml = ''' <host-status-information> <host-status-info> <host>{0}</host> <status>{1}</status> <date>{2}</date> </host-status-info> </host-status-information> '''.format(hostip, pingstatus, now) tree = etree.fromstring(xml) print (etree.tostring(tree))
마찬가지로 SLAX 작업 스크립트는 다음을 사용할 수 있습니다.
var $node = { <host-status-information> { <host-status-info> { <host> $ip; <status> $pingstatus; <date> $date; } } } copy-of $node;
장비에서 작업 스크립트 검증 및 로딩
YANG RPC 정의에서 작업 스크립트의 파일 이름을 값으로 사용하는 명령문 및 junos:action-execute
junos:script
하위 설정을 포함하여 junos:command
RPC의 작업 스크립트를 지정합니다. 각 RPC에 대해 오직 하나의 작업 스크립트만 정의해야 합니다. 예를 들어:
rpc rpc-name { ... junos:command "show sw-info" { junos:action-execute { junos:script "sw-info.py"; } } ... }
Junos OS 릴리스 17.3 action-execute
부터 이 명령문은 에 대한 하위 상태입니다 command
. 이전 릴리스 action-execute
에서와 command
명령문은 동일한 수준으로 배치되며 command
명령문은 옵션입니다.
Junos OS를 실행하는 디바이스에 대한 RPC를 정의하는 YANG 모듈은 Junos OS DDL 확장 모듈을 임포트해야 합니다.
Python 작업 스크립트는 Junos OS를 실행하는 디바이스에서 스크립트를 실행하기 전에 다음 요구 사항을 충족해야 합니다.
-
파일 소유자는 Junos OS
super-user
로그인 클래스의 루트 또는 사용자입니다. -
파일 소유자만이 파일에 대한 쓰기 권한을 가지고 있습니다.
-
스크립트에는 Action Script 보일러플레이트에서 설명한 바와 같이 해석기 지시선이 포함되어 있습니다.
-
language python
서명되지 않은 Python 스크립트를[edit system scripts]
실행하도록 계층 수준에서 구성됩니다language python3
.
Junos OS 릴리스 20.2R1 및 Junos OS Evolved Release 22.3R1부터 이 디바이스는 Python 3을 사용하여 YANG 작업 및 변환 스크립트를 실행합니다. 이전 릴리스에서 Junos OS는 Python 2.7만 사용하여 이러한 스크립트를 실행하며, Junos OS Evolved는 기본적으로 Python 2.7을 사용하여 스크립트를 실행합니다.
사용자는 스크립트의 파일 권한에 사용자, 그룹 또는 기타 순서로 사용자가 있는 첫 번째 클래스에 대한 읽기 권한을 포함하는 경우에만 Junos OS를 실행하는 장치에서 서명되지 않은 Python 스크립트를 실행할 수 있습니다.
명령을 발행 request system yang validate action-script
하고 스크립트에 대한 경로를 제공함으로써 CLI에서 작업 스크립트의 구문을 검증할 수 있습니다. 예를 들어:
user@host> request system yang validate action-script /var/tmp/sw-info.py Scripts syntax validation : START Scripts syntax validation : SUCCESS
작업 스크립트를 사용하려면 해당 RPC가 포함된 YANG 모듈을 사용하여 장비에 로드해야 합니다. 또는 request system yang update
명령을 사용하여 장비의 request system yang add
새 또는 기존 YANG 패키지에 YANG 모듈과 관련 작업 스크립트를 추가합니다. 모듈 및 작업 스크립트를 디바이스에 추가한 후 사용자 지정 RPC를 실행할 수 있습니다. RPC를 실행하면 디바이스가 참조 스크립트를 호출합니다.
문제 해결 작업 스크립트
기본적으로 작업 스크립트는 스크립트가 실행되면 정보 추적 메시지를 기록합니다. 추적 메시지를 통해 RPC가 스크립트를 호출하고 스크립트가 올바르게 실행되었는지 확인할 수 있습니다. 스크립트가 어떠한 이유로 실패하면 오류가 trace 파일에 로깅됩니다.
Junos OS
실행 중인 Junos OS 디바이스에서 작업 스크립트 추적 메시지를 보려면 action.log trace 파일의 내용을 확인하십시오.
user@host> show log action.log
진화한 Junos OS
Junos OS Evolved 장치에서 작업 스크립트 추적 메시지를 보려면 모든 스크립트 유형에 대한 추적 데이터가 포함된 cscript 애플리케이션 추적 메시지를 봅니다.
user@host> show trace application cscript
empty
입력 매개 변수를 지원하며 작업 스크립트에 전달된 값은 매개 변수 이름입니다.
action-execute
부터 이 명령문은 에 대한 하위 상태입니다
command
.