이 페이지에서
예: 커밋 스크립트를 사용하여 영구 및 임시 구성 변경 생성
예: 지속적인 변화 생성
Junos OS 커밋 스크립트를 사용하면 커밋 프로세스 중에 자신의 관행과 정책에 따라 구성 확인 프로세스를 사용자 정의하고 사용자 지정 구성 규칙을 적용할 수 있습니다. 이 예는 명령문이 구성에 이미 포함되지 않은 경우 SONET/SDH 인터페이스 구성에 문을 추가하는 family mpls
영구 변경을 생성하는 커밋 스크립트를 보여줍니다. 인터페이스에서 MPLS 프로토콜 체계를 명시적으로 구성하지 않으면 MPLS 애플리케이션에 대해 인터페이스가 활성화되지 않습니다.
요구 사항
이 예는 다음과 같은 하드웨어 및 소프트웨어 구성 요소를 사용합니다.
하나 이상의 SONET/SDH 인터페이스를 통해 Junos OS 실행하는 디바이스입니다.
Python 스크립트를 사용할 때 릴리스 16.1R3 이상에서 Junos OS.
개요 및 커밋 스크립트
이 예의 커밋 스크립트는 논리적 인터페이스가 구성되었지만 명령문이 구성되지 않은 모든 SONET/SDH 인터페이스를 family mpls
찾습니다. 이러한 인터페이스의 경우, 스크립트는 family mpls
계층 수준에서 지속적인 변경으로 인터페이스 구성에 [edit interfaces interface-name unit logical-unit-number]
문을 추가합니다. 스크립트는 SLAX, XSLT 및 Python에 표시됩니다.
커밋 스크립트의 SLAX 및 XSLT 버전은 junos.xsl 가져오기 파일에 포함된 도우미 템플릿인 템플릿을 사용하여 jcs:emit-change
지속적인 변경을 생성합니다. 템플릿의 jcs:emit-change
매개변수는 tag
생략되어 스크립트가 지속적인 변화로 변경을 내보낸다. 템플릿의 jcs:emit-change
매개 변수에는 content
영구 변경으로 추가할 구성 문이 포함됩니다. 템플릿의 jcs:emit-change
매개 변수에는 message
CLI에 표시될 경고 메시지가 포함되어 구성이 변경되었음을 알려줍니다.
Python 버전의 커밋 스크립트는 모듈에서 jcs
가져온 함수를 jcs.emit_change()
사용하여 영구 변경을 생성합니다. Python 스크립트는 위치 인수 '변경'을 전달하여 지속적인 변경임을 나타냅니다.
XSLT 구문
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]/unit"> <xsl:if test="not(family/mpls)"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="message"> <xsl:text>Adding 'family mpls' to SONET/SDH interface.</xsl:text> </xsl:with-param> <xsl:with-param name="content"> <family> <mpls/> </family> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
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 "../import/junos.xsl"; match configuration { for-each (interfaces/interface[starts-with(name, 'so-')]/unit) { if (not(family/mpls)) { call jcs:emit-change() { with $message = { expr "Adding 'family mpls' to SONET/SDH interface."; } with $content = { <family> { <mpls>; } } } } } }
Python 구문
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./interfaces/ \ interface[starts-with(name,'so-')]/unit"): if element.find('family/mpls') is None: if_name = element.find('../name').text unit_name = element.find('name').text change_xml = """ <interfaces> <interface> <name>{0}</name> <unit> <name>{1}</name> <family> <mpls> </mpls> </family> </unit> </interface> </interfaces> """.format(if_name, unit_name).strip() jcs.emit_change(change_xml, "change", "xml") jcs.emit_warning("Adding 'family mpls' to SONET/SDH interface: " + if_name) if __name__ == '__main__': main()
구성
절차
단계별 절차
스크립트를 다운로드, 활성화, 테스트하기 위해 사용할 수 있습니다.
스크립트를 텍스트 파일로 복사하여 mpls.xsl, mpls.slax 또는 mpls.py 적절한 경우 이름을 지정하고 디바이스의 /var/db/scripts/commit/ directory로 복사합니다.
참고:서명되지 않은 Python 스크립트는 Junos OS
super-user
로그인 클래스의 루트 또는 사용자가 소유해야 하며 파일 소유자만 파일에 대한 쓰기 권한을 가질 수 있습니다.구성 모드에서 문 및 스크립트 파일 이름을
[edit system scripts commit]
계층 수준에서 구성file
합니다.[edit] user@host# set system scripts commit file mpls.xsl
스크립트가 Python으로 작성된 경우 부호 없는 Python 스크립트를 실행하도록 합니다.
[edit] user@host# set system scripts language python
참고:language python3
Python 3을 사용하여 Python 스크립트를 실행하도록 명령문을 구성하거나 Python 2.7을 사용하여 Python 스크립트를 실행하도록 명령문을 구성language python
합니다. 자세한 내용은 언어를 참조하십시오.커밋 스크립트가 영구 변경을 올바르게 생성하는지 테스트하려면 구성에 변경을 유도하는 조건이 포함되어 있는지 확인합니다. 이 스크립트를
family mpls
테스트하려면 적어도 하나의 SONET/SDH 인터페이스에 대해 문이 계층 수준에 포함되지[edit interfaces so-fpc/pic/port unit logical-unit-number]
않도록 해야 합니다.commit check
명령을 실행하여 커밋 스크립트 처리 추적을 미리 확인하여 스크립트가 후보 구성에 영구 변경을 추가할 수 있는지 확인합니다. 명령은commit check
커밋 전에 구성 구문을 확인하지만 변경 사항을 커밋하지는 않습니다.이 예의 커밋 스크립트는 변경이 발생할 때마다 메시지를 생성합니다.
commit check
명령을 사용하여 이러한 메시지를 미리 보기를 통해 스크립트가 적절한 인터페이스에 대한 문으로 구성을family mpls
업데이트할지 여부를 결정합니다.commit check | display xml
명령을 실행하여 XML 형식의 메시지 버전을 표시합니다. 샘플 출력은 스크립트가 커밋 작업 중에 so-2/3/4.0 인터페이스 구성에 문을 추가할family mpls
것임을 나타냅니다.[edit] user@host# commit check | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/11.2R1/junos"> <commit-results> <routing-engine junos:style="normal"> <name>re0</name> <xnm:warning xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <edit-path> [edit interfaces interface so-2/3/4 unit 0] </edit-path> <message> Adding 'family mpls' to SONET/SDH interface. </message> </xnm:warning> <commit-check-success/> </routing-engine> </commit-results> </rpc-reply>
커밋 스크립트 처리에 대한 자세한 추적을 표시하려면 명령을 실행합니다
commit check | display detail
. 샘플 출력에서는 커밋 작업 중에 구성에 로드되는 한 가지 영구 변경이 있습니다.[edit] user@host# commit check | display detail 2011-06-17 14:17:35 PDT: reading commit script configuration 2011-06-17 14:17:35 PDT: testing commit script configuration 2011-06-17 14:17:35 PDT: opening commit script '/var/db/scripts/commit/mpls.xsl' 2011-06-17 14:17:35 PDT: reading commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: running commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: processing commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: no errors from mpls.xsl 2011-06-17 14:17:35 PDT: saving commit script changes for script mpls.xsl 2011-06-17 14:17:35 PDT: summary of script mpls.xsl: changes 1, transients 0, syslog 0 2011-06-17 14:17:35 PDT: start loading commit script changes 2011-06-17 14:17:35 PDT: loading commit script changes into real db 2011-06-17 14:17:35 PDT: finished commit script changes into real db 2011-06-17 14:17:35 PDT: no transient commit script changes 2011-06-17 14:17:35 PDT: finished loading commit script changes 2011-06-17 14:17:35 PDT: copying juniper.db to juniper.data+ 2011-06-17 14:17:35 PDT: finished copying juniper.db to juniper.data+ ... configuration check succeeds
스크립트가 올바른 변경 사항을 생성하는지 확인한 후 명령을 실행
commit
하여 커밋 작업을 시작하고 스크립트를 실행합니다.user@host# commit
확인
구성 확인
목적
올바른 변경 사항이 구성에 통합되는지 확인합니다.
작업
커밋 작업을 실행한 후 구성 모드 명령을 실행하여 구성을 show interfaces
확인합니다. 스크립트가 실행되기 전에 하나 이상의 SONET/SDH 인터페이스에서 MPLS 프로토콜 체계가 활성화되지 않은 경우 출력은 다음과 유사합니다.
[edit] user@host# show interfaces ... other configured interface types ... so-2/3/4 { unit 0 { family mpls; # Added by persistent change } } ... other configured interface types ...
예: 임시 변경 생성
이 예는 커밋 스크립트를 사용하여 IPv4 프로토콜 체계가 활성화된 모든 SONET/SDH 인터페이스에서 PPP 캡슐화를 설정합니다. 변경 사항은 임시 변경으로 추가됩니다.
요구 사항
이 예는 다음과 같은 하드웨어 및 소프트웨어 구성 요소를 사용합니다.
하나 이상의 SONET/SDH 인터페이스를 통해 Junos OS 실행하는 디바이스입니다.
Python 스크립트를 사용할 때 릴리스 16.1R3 이상에서 Junos OS.
개요 및 커밋 스크립트
이 예의 커밋 스크립트는 구성에서 활성화된 IPv4 프로토콜 체계가 있는 모든 SONET/SDH 인터페이스를 찾아 인터페이스 구성에 문을 추가합니다 encapsulation ppp
. 커밋 스크립트는 임시 변경을 생성하여 체크아웃 구성에 변경 사항을 추가하지만 후보 구성은 추가하지 않습니다. 스크립트는 SLAX, XSLT 및 Python에 표시됩니다.
커밋 스크립트의 SLAX 및 XSLT 버전은 junos.xsl 가져오기 파일에 포함된 도우미 템플릿인 템플릿을 사용하여 jcs:emit-change
임시 변경을 생성합니다. tag
템플릿의 jcs:emit-change
매개변수에는 스크립트가 지속적인 변경이 아닌 임시 변경으로 변경을 내보하도록 지시하는 값transient-change
이 있습니다. 템플릿의 jcs:emit-change
매개 변수에는 content
임시 변경으로 추가할 구성 문이 포함됩니다.
Python 버전의 커밋 스크립트는 모듈에서 jcs
가져온 함수를 jcs.emit_change()
사용하여 일시적 변경을 생성합니다. Python 스크립트는 위치 인수 '임시 변경'을 통과하여 임시 변경임을 나타냅니다.
XSLT 구문
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') and unit/family/inet]"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="tag" select="'transient-change'"/> <xsl:with-param name="content"> <encapsulation>ppp</encapsulation> </xsl:with-param> </xsl:call-template> </xsl:for-each> </xsl:template> </xsl:stylesheet>
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 "../import/junos.xsl"; match configuration { for-each (interfaces/interface[starts-with(name, 'so-') and unit/family/inet]) { call jcs:emit-change($tag = 'transient-change') { with $content = { <encapsulation> "ppp"; } } } }
Python 구문
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./interfaces/ \ interface[starts-with(name,'so-') and unit/family/inet]"): if_name = element.find('name').text change_xml = """ <interfaces> <interface> <name>{0}</name> <encapsulation>ppp</encapsulation> </interface> </interfaces> """.format(if_name).strip() jcs.emit_change(change_xml, "transient-change", "xml") jcs.emit_warning("Adding 'ppp' encapsulation to SONET interface: " + if_name) jcs.emit_warning(change_xml) if __name__ == '__main__': main()
구성
절차
단계별 절차
스크립트를 다운로드, 활성화, 테스트하기 위해 사용할 수 있습니다.
스크립트를 텍스트 파일로 복사하여 파일 의 이름을 encap-ppp.xsl, encap-ppp.slax 또는 encap-ppp.py 적절하게 지정하고 디바이스의 /var/db/scripts/commit/ directory로 복사합니다.
참고:서명되지 않은 Python 스크립트는 Junos OS
super-user
로그인 클래스의 루트 또는 사용자가 소유해야 하며 파일 소유자만 파일에 대한 쓰기 권한을 가질 수 있습니다.구성 모드에서 문 및 스크립트 파일 이름을
[edit system scripts commit]
계층 수준에서 구성file
합니다.[edit] user@host# set system scripts commit file encap-ppp.xsl
allow-transients
명령문을 구성하여 커밋 스크립트가 체크아웃 구성에 임시 변경을 로드할 수 있도록 합니다.[edit] user@host# set system scripts commit allow-transients
스크립트가 Python으로 작성된 경우 부호 없는 Python 스크립트를 실행하도록 합니다.
[edit] user@host# set system scripts language python
참고:language python3
Python 3을 사용하여 Python 스크립트를 실행하도록 명령문을 구성하거나 Python 2.7을 사용하여 Python 스크립트를 실행하도록 명령문을 구성language python
합니다. 자세한 내용은 언어를 참조하십시오.커밋 스크립트가 임시 변경을 올바르게 생성하는지 테스트하려면 구성에 변경을 유도하는 조건이 포함되어 있는지 확인합니다.
encapsulation ppp
적어도 하나의 SONET/SDH 인터페이스에[edit interfaces so-fpc/pic/port]
대해 문이 계층 수준에 포함되지 않도록 합니다.commit check
명령을 실행하여 커밋 스크립트 처리 추적을 미리 확인하여 스크립트가 체크아웃 구성에 임시 변경을 추가할지 확인합니다. 명령은commit check
커밋 전에 구성 구문을 확인하지만 변경 사항을 커밋하지는 않습니다.commit check | display detail
명령을 실행하여 커밋 스크립트 처리에 대한 자세한 추적을 표시합니다. 샘플 출력에는 체크아웃 구성에 로드된 두 가지 임시 변경 사항이 있습니다.[edit] user@host# commit check | display detail 2011-06-15 12:07:30 PDT: reading commit script configuration 2011-06-15 12:07:30 PDT: testing commit script configuration 2011-06-15 12:07:30 PDT: opening commit script '/var/db/scripts/commit/encap-ppp.xsl' 2011-06-15 12:07:30 PDT: reading commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: running commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: processing commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: no errors from encap-ppp.xsl 2011-06-15 12:07:30 PDT: saving commit script changes for script encap-ppp.xsl 2011-06-15 12:07:30 PDT: summary of script encap-ppp.xsl: changes 0, transients 2 (allowed), syslog 0 2011-06-15 12:07:30 PDT: start loading commit script changes 2011-06-15 12:07:30 PDT: no commit script changes 2011-06-15 12:07:30 PDT: updating transient changes into transient tree 2011-06-15 12:07:30 PDT: finished loading commit script changes 2011-06-15 12:07:30 PDT: copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: finished copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: exporting juniper.conf 2011-06-15 12:07:30 PDT: merging transient changes ... configuration check succeeds
스크립트가 올바른 변경 사항을 생성하는지 확인한 후 명령을 실행
commit
하여 커밋 작업을 시작하고 스크립트를 실행합니다.user@host# commit
확인
구성 확인
목적
올바른 변경 사항이 체크아웃 구성에 통합되는지 확인합니다. IPv4 프로토콜 체계가 활성화된 하나 이상의 SONET/SDH 인터페이스가 있는 경우, 인터페이스 계층에 임시 변경으로 문이 추가된 것을 보아야 encapsulation ppp
합니다.
작업
임시 변경으로 구성을 보려면 구성 모드 명령을 실행합니다 show interfaces | display commit-scripts
. show interfaces | display commit-scripts
명령은 임시 변경에 의해 생성된 문을 포함하여 구성에 있는 모든 문을 표시합니다. IPv4 프로토콜 체계가 활성화된 하나 이상의 SONET/SDH 인터페이스가 있는 경우 출력은 다음과 유사합니다.
[edit] user@host# show interfaces | display commit-scripts ... so-1/2/3 { mtu 576; encapsulation ppp; /* Added by transient change. */ unit 0 { family inet { address 10.0.0.3/32; } } } so-1/2/4 { encapsulation ppp; /* Added by transient change. */ unit 0 { family inet { address 10.0.0.4/32; } } } so-2/3/4 { encapsulation cisco-hdlc; # Not affected by the script, because IPv4 protocol # family is not configured on this interface. unit 0 { family mpls; } }
문제 해결
커밋 오류 문제 해결
문제
CLI는 잘못된 임시 변경 오류를 생성하고 커밋이 실패합니다.
user@host# commit check error: invalid transient change generated by commit script: encap-ppp.xsl warning: 1 transient change was generated without [system scripts commit allow-transients] error: 1 error reported by commit scripts error: commit script failure
솔루션
커밋 스크립트가 allow-transients
임시 변경을 체크아웃 구성에 로드할 수 있도록 계층 수준에서 문을 [edit system scripts commit]
구성해야 합니다.
임시 변경을 허용하도록 다음 문을 구성합니다.
[edit] user@host# set system scripts commit allow-transients