예: Junos PyEZ를 사용하여 파일에서 구성 데이터 로드
Junos PyEZ 라이브러리를 사용하면 Junos 디바이스에서 운영 및 구성 작업을 수행할 수 있습니다. 이 예에서는 Junos PyEZ jnpr.junos.utils.config.Config
유틸리티를 사용하여 구성 관리 서버의 로컬 파일에서 Junos 디바이스로 구성 데이터를 로드합니다.
요구 사항
이 예에서 사용되는 하드웨어 및 소프트웨어 구성 요소는 다음과 같습니다.
Python 3.5 이상 및 Junos PyEZ 릴리스 2.0 이상을 실행하는 구성 관리 서버
NETCONF가 활성화된 Junos 디바이스 및 적절한 권한으로 구성된 사용자 계정
서버 및 Junos 디바이스의 해당 사용자에 대해 구성된 SSH 퍼블릭/프라이빗 키 쌍
개요
이 예는 Junos PyEZ Config
유틸리티를 사용하여 지정된 디바이스의 구성에서 새로운 op 스크립트를 활성화하는 Python 애플리케이션을 보여줍니다. 구성 관리 서버에 있는 junos-config-add-op-script.conf 파일에는 ASCII 텍스트 형식의 관련 구성 데이터가 포함되어 있습니다.
Python 애플리케이션은 Junos 디바이스와의 연결을 처리하는 클래스, Config
대상 디바이스에서 구조화되지 않은 구성 변경을 수행하는 데 사용되는 클래스 및 Junos 디바이스를 관리할 때 발생하는 예외를 포함하는 모듈의 필수 예외 jnpr.junos.exception
를 가져옵니다Device
. 이 예제에서는 클래스의 인스턴스에 대한 독립 실행형 변수를 만드는 대신 인스턴스를 Device
인스턴스에 바인딩 Config
합니다Config
.
대상 디바이스에 open()
대한 인스턴스를 생성한 Device
후 메서드는 디바이스와의 연결 및 NETCONF 세션을 설정합니다. Config
그런 다음 유틸리티 메서드는 후보 구성을 잠그고, 구성 변경 사항을 작업으로 후보 구성에 load merge
로드하고, 후보 구성을 커밋한 다음 잠금을 해제합니다.
load()
method path
매개 변수는 구성 파일의 경로로 설정됩니다. 구성 파일 확장명은 구성 데이터의 format
형식을 나타내므로 매개 변수는 인수 목록에서 생략됩니다. 설정은 merge=True
장치가 작업을 수행해야 load merge
함을 나타냅니다.
구성 작업이 완료된 후 애플리케이션은 메서드를 호출하여 close()
NETCONF 세션 및 연결을 종료합니다. 애플리케이션에는 구성을 잠글 때 발생하는 오류 및 CommitError
커밋 작업 중에 발생하는 오류와 같은 LockError
예외를 처리하기 위한 코드가 포함되어 있습니다. 응용 프로그램에는 발생할 수 있는 추가 예외를 처리하는 코드도 포함되어 있습니다.
구성
구성 데이터 파일 만들기
단계별 절차
Junos PyEZ 애플리케이션에서 사용하는 구성 데이터 파일을 생성하려면 다음을 수행합니다.
구성 데이터의 형식(이 예에서는 ASCII 텍스트)에 따라 적절한 확장자를 가진 새 파일을 만듭니다.
파일에 원하는 구성 변경 사항을 포함합니다. 예를 들면 다음과 같습니다.
system { scripts { op { file bgp-neighbors.slax; } } }
Junos PyEZ 애플리케이션 생성
단계별 절차
Junos PyEZ를 사용하여 Junos 디바이스에서 구성을 변경하는 Python 애플리케이션을 생성하려면 다음을 수행합니다.
필요한 모듈, 클래스 및 개체를 가져옵니다.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
필수 변수를 포함합니다. 이 예에서는 매니지드 디바이스의 호스트 이름과 구성 데이터가 포함된 파일의 경로가 포함됩니다.
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
main()
함수 정의 및 함수 호출을 만들고 나머지 명령문을 정의 내에 배치합니다.def main(): if __name__ == "__main__": main()
클래스의 인스턴스를
Device
만들고 해당 특정 연결에 필요한 호스트 이름과 매개 변수를 제공합니다.그런 다음 연결을 열고 디바이스와의 NETCONF 세션을 설정합니다.
# open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
인스턴스를 인스턴스에 바인딩
Config
합니다Device
.dev.bind(cu=Config)
구성을 잠급니다.
# Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
구성 변경 사항을 로드하고 오류를 처리합니다.
print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
구성을 커밋합니다.
print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
구성의 잠금을 해제합니다.
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
NETCONF 세션을 종료하고 디바이스와의 연결을 닫습니다.
# End the NETCONF session and close the connection dev.close()
결과
구성 관리 서버에서 완료된 응용 프로그램을 검토합니다. 응용 프로그램에 의도한 코드가 표시되지 않으면 이 예제의 지침을 반복하여 응용 프로그램을 수정합니다.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf' def main(): # open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return dev.bind(cu=Config) # Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Junos PyEZ 애플리케이션 실행
응용 프로그램 실행
-
구성 관리 서버에서 응용 프로그램을 실행합니다.
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
확인
구성 확인
목적
Junos 디바이스에서 구성이 올바르게 업데이트되었는지 확인합니다.
작업
Junos 디바이스에 로그인하고 구성, 커밋 기록 및 로그 파일을 확인하여 구성과 커밋을 확인합니다. 예를 들어:
user@dc1a> show configuration system scripts op { file bgp-neighbors.slax; }
user@dc1a> show system commit 0 2014-07-29 14:40:50 PDT by user via netconf ...
user@dc1a> show log messages Jul 29 14:40:36 dc1a sshd[75843]: Accepted publickey for user from 198.51.100.1 port 54811 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Jul 29 14:40:36 dc1a sshd[75843]: subsystem request for netconf by user user Jul 29 14:40:42 dc1a file[75846]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Loaded by example.) Jul 29 14:40:45 dc1a mspd[75888]: mspd: No member config Jul 29 14:40:45 dc1a mspd[75888]: mspd: Building package info Jul 29 14:40:51 dc1a mspd[1687]: mspd: No member config Jul 29 14:40:51 dc1a mspd[1687]: mspd: Building package info Jul 29 14:40:51 dc1a file[75846]: UI_COMMIT_COMPLETED: commit complete
의미
구성 및 로그 파일 내용은 디바이스에서 올바른 구성 명령문이 성공적으로 구성되고 커밋되었음을 나타냅니다.
문제 해결
시간 초과 오류 문제 해결
문제
Junos PyEZ 코드는 RpcTimeoutError 메시지 또는 TimeoutExpiredError 메시지를 생성하고 디바이스 구성을 업데이트하지 못합니다.
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
NETCONF RPC의 시간 초과에 대한 기본 시간은 30초입니다. 대규모 구성 변경으로 인해 이 값을 초과하면 구성을 업로드하고 커밋하기 전에 작업 시간이 초과될 수 있습니다.
솔루션
기본 시간 제한 간격보다 긴 커밋 시간이 필요할 수 있는 구성 변경을 수용하려면 시간 제한 간격을 적절한 값으로 설정하고 코드를 다시 실행합니다. 간격을 구성하려면 속성을 적절한 값으로 설정 Device
timeout
하거나, 디바이스에서 구성 데이터를 커밋하기 위해 메서드를 호출할 commit()
때 인수를 포함합니다timeout=seconds
. 예를 들어:
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
구성 잠금 오류 문제 해결
문제
Junos PyEZ 코드는 구성을 잠글 수 없음을 나타내는 LockError 메시지를 생성합니다. 예를 들어:
LockError(severity: error, bad_element: None, message: configuration database modified)
구성 잠금 오류는 다음과 같은 이유로 발생할 수 있습니다.
다른 사용자가 구성에 대한 배타적 잠금을 가지고 있습니다.
공유 구성 데이터베이스에 커밋되지 않은 변경 내용이 있습니다.
Junos PyEZ 코드를 실행하는 사용자는 디바이스를 구성할 수 있는 권한이 없습니다.
솔루션
다른 사용자가 구성에 대한 배타적 잠금을 가지고 있거나 구성을 수정한 경우 잠금이 해제되거나 변경 내용이 커밋될 때까지 기다렸다가 코드를 다시 실행합니다. 문제의 원인이 사용자에게 디바이스 구성 권한이 없는 경우, 필요한 권한이 있는 사용자로 애플리케이션을 실행하거나, 적절한 경우 현재 사용자에게 변경을 수행하는 데 필요한 권한을 부여하도록 Junos 디바이스를 구성합니다.
구성 변경 오류 문제 해결
문제
Junos PyEZ 코드는 권한 문제로 인해 구성을 수정할 수 없음을 나타내는 ConfigLoadError 메시지를 생성합니다.
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
이 오류 메시지는 Junos PyEZ 코드를 실행하는 사용자에게 구성을 변경할 수 있는 권한이 있지만 원하는 구성 부분을 변경할 수 있는 권한이 없을 때 생성될 수 있습니다.
솔루션
필요한 권한을 가진 사용자로 애플리케이션을 실행하거나, 적절한 경우 현재 사용자에게 변경을 수행하는 데 필요한 권한을 부여하도록 Junos 디바이스를 구성합니다.