Junos PyEZ를 사용하여 Junos 디바이스에 소프트웨어 설치
Junos PyEZ jnpr.junos.utils.sw.SW
유틸리티를 사용하면 Junos 디바이스에 소프트웨어 이미지를 설치하거나 업그레이드할 수 있습니다. 이 install()
메서드는 지정된 소프트웨어 패키지를 설치합니다.
이 주제에서는 지원되는 구축 시나리오, 소프트웨어 이미지 위치를 지정하는 방법, Junos PyEZ를 사용하여 디바이스를 업그레이드할 때의 일반적인 설치 프로세스 및 옵션에 대해 설명합니다. 또한 Junos PyEZ를 사용하여 이러한 기능을 지원하는 디바이스에서 VM 호스트 업그레이드, 통합 ISSU(In-Service Software Upgrade) 또는 NSSU(Nonstop Software Upgrade)와 같은 보다 전문화된 업그레이드 시나리오를 수행하는 방법에 대해서도 설명합니다.
지원되는 배포 시나리오
Junos PyEZ jnpr.junos.utils.sw.SW
유틸리티를 사용하면 개별 Junos 디바이스 또는 혼합 또는 비혼합 Virtual Chassis의 멤버에 소프트웨어 이미지를 설치하거나 업그레이드할 수 있습니다. 지원되는 시나리오는 다음과 같습니다.
-
단일 라우팅 엔진을 갖춘 독립형 디바이스
-
듀얼 라우팅 엔진을 장착한 독립형 디바이스
-
혼합 모드 및 비혼합 모드 구성의 EX 시리즈 Virtual Chassis
-
혼합 모드 및 비혼합 모드 구성의 QFX 시리즈 Virtual Chassis
-
혼합 EX 시리즈 및 QFX 시리즈 Virtual Chassis
-
VM 호스트를 지원하는 라우팅 엔진에서 VM 호스트 업그레이드
-
통합 ISSU 또는 NSSU와 같이 일부 형태의 서비스 중 기능이 활성화된 구축 구성
Junos PyEZ 릴리스 2.6.8부터 인수를 사용하여 member_id
EX 시리즈 Virtual Chassis의 특정 멤버에 패키지를 설치할 수 있습니다.
이 유틸리티는 jnpr.junos.utils.sw.SW
MX 시리즈 버추얼 섀시, SRX 시리즈 섀시 클러스터 또는 버추얼 섀시 패브릭(VCF)의 디바이스 업그레이드를 지원하지 않습니다.
소프트웨어 이미지 위치 지정 방법
Junos PyEZ를 사용하여 Junos 디바이스에 소프트웨어를 설치할 때 소프트웨어 이미지를 구성 관리 서버에 다운로드할 수 있으며 install()
, 이 방법은 기본적으로 설치를 수행하기 전에 대상 디바이스에 복사합니다. 대상 장치에 이미 있거나 대상 장치에서 연결할 수 있는 URL에 있는 이미지를 설치하도록 메서드에 지시 install()
할 수도 있습니다.
표 1 은 소프트웨어 패키지 위치에 따라 설정해야 하는 메소드 파라미터를 간 install()
략하게 설명합니다. 메서드 호출에는 package
install()
항상 또는 pkg_set
매개 변수를 포함해야 합니다.
소프트웨어 패키지 위치 |
|
|
|
---|---|---|---|
구성 관리 서버 |
생략 또는 설정 |
Junos PyEZ를 실행하는 로컬 서버에 있는 소프트웨어 패키지 또는 패키지의 파일 이름을 포함한 파일 경로입니다. |
(선택 사항) 패키지를 복사할 대상 장치의 디렉터리에 대한 경로입니다. 기본값은 /var/tmp입니다. |
대상 장치 |
로 설정 |
소프트웨어 패키지의 파일 이름입니다. |
(선택 사항) 패키지가 이미 있어야 하는 대상 장치의 디렉터리 경로입니다. 기본값은 /var/tmp입니다. |
URL (영문) |
– |
소프트웨어 패키지가 설치된 대상 Junos 디바이스의 관점에서의 URL입니다. |
– |
인수는 package
단일 Junos 디바이스 또는 비혼합 Virtual Chassis의 멤버에 소프트웨어를 설치하는 데 사용됩니다. 인수는 package
단일 소프트웨어 이미지를 지정하는 문자열입니다. 예를 들어:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
인수는 pkg_set
혼합 Virtual Chassis의 멤버에 소프트웨어를 설치하는 데 사용됩니다. 여기에는 다양한 Virtual Chassis 멤버에 대해 특별한 순서 없이 필요한 소프트웨어 이미지를 지정하는 문자열 목록 또는 튜플이 포함되어 있습니다. 예를 들어:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
Junos PyEZ를 실행하는 로컬 서버에 상주하는 패키지의 경우, 인수를 no_copy
생략하거나 로 False
설정하면 서버가 지정된 소프트웨어 패키지를 디바이스에 복사합니다. 인수를 package
포함하면 서버가 패키지를 대상 디바이스(비혼합 Virtual Chassis의 개별 디바이스 또는 기본 라우터나 스위치)에 복사하고, 인수를 pkg_set
포함하면 목록이 있는 모든 패키지를 혼합 Virtual Chassis의 기본 라우터나 스위치에 복사합니다. 기본적으로 인수가 다른 디렉토리를 지정하지 않는 한 remote_path
소프트웨어 이미지는 /var/tmp 디렉토리에 배치됩니다.
인수를 no_copy
True로 설정하면 설치가 시작되기 전에 필요한 소프트웨어 패키지가 대상 디바이스 또는 Virtual Chassis 기본 디바이스에 이미 존재해야 합니다. 패키지는 인수로 remote_path
지정된 디렉터리에 있어야 하며, 생략된 경우 remote_path
기본 /var/tmp 디렉터리에 있어야 합니다.
Junos PyEZ는 URL에서 소프트웨어 이미지 설치도 지원합니다. 이 경우 또는 pkg_set
값은 package
대상 Junos 디바이스의 관점에서 본 URL이어야 합니다. 패키지는 지정된 URL에서 복사되어 설치되며 no-copy
및 remote_path
인수는 무시됩니다. URL 형식 지정에 대한 자세한 내용은 Junos OS CLI 명령에서 파일 이름 및 URL 지정 형식을 참조하십시오.
설치 과정 개요
Junos 디바이스에 소프트웨어 이미지를 설치하기 위해 Junos PyEZ 애플리케이션은 개별 디바이스 또는 Virtual Chassis의 기본 디바이스에 연결하고, 유틸리티의 SW
인스턴스를 생성하고, 필수 또는 선택적 인수를 사용하여 메서드를 호출합니다 install()
. 예를 들어:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # In Junos PyEZ Release 2.4.1 and earlier, install() returns a Boolean # ok = sw.install(package=pkg, validate=True, checksum_algorithm='sha256') # In Junos PyEZ Release 2.5.0 and later, install() returns a tuple ok, msg = sw.install(package=pkg, validate=True, checksum_algorithm='sha256') print("Status: " + str(ok) + ", Message: " + msg) if ok: sw.reboot()
메서드 매개 변수의 현재 목록은 install()
install()을 참조하십시오.
소프트웨어 패키지가 구성 관리 서버에 no_copy
있고 매개 변수가 생략되거나 False install()
로 설정된 경우 메서드는 소프트웨어를 설치하기 전에 다음 작업을 수행합니다.
-
인수를 통해 체크섬이 아직 제공되지 않은 경우 인수에
checksum_algorithm
지정된 알고리즘을 사용하여 로컬 소프트웨어 패키지의 체크섬을checksum
계산합니다. 사용할 수checksum_algorithm
있는 값은"md5"
,"sha1"
, 입니다"sha256"
. 기본값은"md5"
입니다. -
이(가)
False
로 설정되지 않는 한cleanfs
대상 장치에서 저장소 정리를 수행하여 소프트웨어 패키지를 위한 공간을 만듭니다. -
SCP 또는 FTP는 패키지를
remote_path
디렉터리로 복사하거나remote_path
, 동일한 이름과 체크섬을 가진 파일이 디바이스의 대상 위치에 아직 상주하지 않는 경우 지정되지 않은 경우 /var/tmp 디렉터리로 복사합니다. -
원격 파일의 체크섬을 계산하여 로컬 파일의 값과 비교합니다.
소프트웨어 패키지가 대상 디바이스에 도착한 후, 처음에 다운로드되었든, 메소드에 의해 install()
구성 관리 서버에서 복사되었든, 대상 디바이스에 의해 URL에서 복사되었든, 메소드는 install()
다음 작업을 수행합니다.
-
매개 변수가 True로 설정된 경우 새 패키지에 대해 구성의
validate
유효성을 검사합니다 -
로 설정되지 않는 한
all_re
모든 라우팅 엔진에 패키지를 설치합니다.False
릴리스 2.1.5부터 Junos PyEZ는 기본적으로 Virtual Chassis의 개별 디바이스 및 멤버에 있는 모든 라우팅 엔진을 업그레이드합니다. 이전 릴리스에서 또는 만약 , all_re=False
Junos PyEZ는 연결된 라우팅 엔진만 업그레이드합니다.
Junos PyEZ 릴리스 2.5.0 install()
부터 이 메서드는 설치 상태와 메시지 문자열이 포함된 튜플을 반환합니다. 이전 릴리스에서는 이 메서드가 설치 상태만 반환합니다. 상태는 True
설치에 성공한 경우이고 False
그렇지 않은 경우입니다. 메시지 문자열은 설치의 성공 또는 실패에 대한 추가 정보를 제공하며 Junos PyEZ 또는 디바이스에서 생성되는 정보 메시지 또는 오류 메시지를 포함할 수 있습니다. 예를 들어:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
이 install()
메서드는 디바이스를 자동으로 재부팅하지 않습니다. 설치가 완료된 후 디바이스를 다시 부팅하거나 종료하려면 또는 shutdown()
메서드를 각각 호출합니다reboot()
.
다음 동영상은 Junos PyEZ를 사용하여 Junos OS를 설치하는 방법을 보여주는 짧은 Python 세션을 보여줍니다.
설치 및 체크섬 시간 제한을 지정하는 방법
Junos PyEZ는 NETCONF 세션을 통해 작업을 수행합니다. NETCONF RPC의 시간 초과에 대한 기본 시간은 30초입니다. 설치 과정에서 Junos PyEZ는 디바이스에 패키지를 복사 및 설치할 때 RPC 시간 제한 간격을 1800초(30분)로, 체크섬을 계산할 때 300초(5분)로 늘립니다. 경우에 따라 설치 프로세스 또는 체크섬 계산이 이러한 시간 간격을 초과할 수 있습니다.
설치 프로세스 및 체크섬 계산에 대한 시간 제한 값을 늘리려면 메서드 호출 install()
에 및 checksum_timeout
매개 변수를 각각 포함하고 timeout
적절한 값으로 설정합니다. 예를 들어:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, validate=True, timeout=2400, checksum_timeout=400) if ok: sw.reboot()
설치 프로세스를 기록하는 방법
Junos PyEZ 설치 프로세스를 사용하면 메서드 호출에 인수를 progress
포함하여 설치 진행 상황을 표시하거나 기록할 수 있습니다install()
. 인수는 콜백 함수로 설정되며, 콜백 함수에는 인스턴스 및 보고서 문자열 인수를 포함하는 함수 프로토타입이 Device
정의되어 있어야 합니다. 기본 보고에 사용하도록 sw.progress()
설정할 progress=True
수도 있습니다.
다음 예제에서는 함수를 사용하여 설치 진행률을 인쇄합니다 myprogress
.
from jnpr.junos import Device from jnpr.junos.utils.sw import SW def myprogress(dev, report): print("host: %s, report: %s" % (dev.hostname, report)) pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, validate=True, progress=myprogress) if ok: sw.reboot()
진행률 출력은 사용자 정의 형식입니다.
user@server:~$ python3 junos-pyez-install.py Found package. Installing: junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: computing checksum on local package: junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: cleaning filesystem ... host: router1.example.net, report: before copy, computing checksum on remote package: /var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 38682624 / 386795750 (10%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 77365248 / 386795750 (20%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 116047872 / 386795750 (30%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 154730496 / 386795750 (40%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 193413120 / 386795750 (50%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 232079360 / 386795750 (60%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 270761984 / 386795750 (70%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 309444608 / 386795750 (80%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 348127232 / 386795750 (90%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 386795750 / 386795750 (100%) host: router1.example.net, report: after copy, computing checksum on remote package: /var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: checksum check passed. host: router1.example.net, report: installing software ... please be patient ... host: router1.example.net, report: software pkgadd package-result: 0 Output: Installing package '/var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz' ... ...
VM 호스트 업그레이드를 수행하는 방법
VM 호스트를 지원하는 라우팅 엔진이 있는 디바이스에서 Junos OS는 Linux 기반 호스트(VM 호스트)를 통해 가상 머신(VM)으로 실행됩니다. VM 호스트 업그레이드에는 VM 호스트 설치 패키지(junos-vmhost-install-x.tgz)가 필요하며 호스트 OS 및 호환 Junos OS를 업그레이드합니다. 업그레이드는 RPC에 request vmhost software add
해당하는 <request-vmhost-package-add>
운영 모드 명령을 사용하여 수행됩니다.
Junos PyEZ 릴리스 2.1.6부터 이 sw.install()
메서드는 VM 호스트 업그레이드를 수행하기 위한 인수를 지원합니다 vmhost=True
. 인수가 vmhost=True
있는 경우 sw.install()
메서드는 RPC 대신 RPC를 <request-vmhost-package-add>
<request-package-add>
사용하여 설치를 수행합니다.
다음 예제에서는 단일 라우팅 엔진 디바이스에서 Junos OS와 호스트 OS를 모두 업그레이드하고 재부팅합니다.
from jnpr.junos import Device from jnpr.junos.utils.sw import SW with Device(host='switch1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, no_copy=True) if ok: sw.reboot(vmhost=True)
Junos OS 소프트웨어만 재부팅하려면 인수 없이 vmhost
메서드를 호출 sw.reboot()
하십시오.
통합 ISSU 또는 NSSU 수행 방법
Junos PyEZ는 기능을 지원하고 필요한 요구 사항을 충족하는 디바이스에서 통합 ISSU(In-Service Software Upgrade) 또는 NSSU(Nonstop Software Upgrade) 수행을 지원합니다. 표 2 에는 통합 ISSU 및 NSSU 기능이 처음 지원되는 Junos PyEZ 릴리스가 요약되어 있습니다. 통합 ISSU 및 NSSU에 대한 자세한 내용은 해당 제품의 소프트웨어 설명서를 참조하십시오.
Junos PyEZ 릴리스 |
기능 지원 |
---|---|
2.1.0 |
듀얼 라우팅 엔진 Junos 디바이스에서 통합 ISSU 및 NSSU를 지원합니다. |
2.1.6 |
명령을 사용하여 |
통합 ISSU 기능을 사용하면 컨트롤 플레인에서 중단 없이 트래픽 중단을 최소화하면서 두 개의 서로 다른 Junos OS 릴리스 간에 업그레이드할 수 있습니다. 이 기능을 지원하는 디바이스에서 통합 서비스 중 소프트웨어 업그레이드를 수행하려면 메서드에 인수를 issu=True
install()
포함합니다.
다음 예제 install()
에서 방법은 라우팅 엔진 모두에서 Junos OS를 업그레이드하고 설치 프로세스의 일부로 새로운 기본 라우팅 엔진(이전의 이전 백업 라우팅 엔진)을 재부팅합니다. 설치에 성공 reboot()
하면 새로운 백업 라우팅 엔진(이전의 기본 라우팅 엔진)인 연결된 라우팅 엔진을 재부팅합니다.
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, issu=True, progress=True) if ok: sw.reboot(all_re=False)
필요한 요구 사항을 충족하고 통합 ISSU를 지원하는 VM 호스트를 지원하는 라우팅 엔진에서 통합 서비스 중인 소프트웨어 업그레이드를 수행하려면 메서드에 및 issu=True
인수를 vmhost=True
install()
포함합니다. 디바이스는 RPC를 사용하여 하나의 호스트 OS 및 Junos OS 릴리스에서 요청된 릴리스로 업그레이드됩니다<request-vmhost-package-in-service-upgrade>
.
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
NSSU 기능을 사용하면 네트워크 트래픽의 중단을 최소화하면서 중복 라우팅 엔진이 있는 스위치 또는 Virtual Chassis에서 실행되는 Junos OS 소프트웨어를 업그레이드할 수 있습니다. 이 기능을 지원하는 디바이스에서 무중단 소프트웨어 업그레이드를 수행하려면 메서드에 인수를 nssu=True
install()
포함합니다. 예를 들어:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'jinstall-ex-4300–14.1X53-D44.3-domestic-signed.tgz' with Device(host='switch1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, nssu=True, progress=True) if ok: sw.reboot(all_re=False)
EX 시리즈 Virtual Chassis 멤버에 소프트웨어를 설치하는 방법
일반적으로 비혼합 EX 시리즈 버추얼 섀시를 업그레이드할 때는 설치 프로세스 개요 에 설명된 설치 프로세스에 따라 전체 버추얼 섀시를 업그레이드합니다. 그러나 Virtual Chassis의 특정 구성원 스위치에 소프트웨어를 설치해야 하는 경우가 있을 수 있습니다. Junos PyEZ 릴리스 2.6.8부터는 인수를 사용하여 member_id
EX 시리즈 Virtual Chassis의 개별 멤버 스위치에 소프트웨어 패키지를 설치할 수 있습니다. 인수는 member_id
소프트웨어를 설치할 멤버 ID를 지정하는 문자열 목록입니다.
예를 들어, 다음 Junos PyEZ 애플리케이션은 EX 시리즈 Virtual Chassis의 멤버 0 및 멤버 1에서 소프트웨어를 업그레이드합니다.
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-ex-x86-64-23.2R1.13.tgz' def myprogress(dev, report): print("host: {}, report: {}".format(dev.hostname, report)) with Device(host='switch2.example.net') as dev: sw = SW(dev) ok, msg = sw.install(package=pkg, member_id=['0', '1'], progress=myprogress, no_copy=True, reboot=False, cleanfs=False, force_host=False, timeout=4000) if ok: sw.reboot(all_re=False, member_id=['0', '1'])
user@server:~$ python3 junos-pyez-install-on-members.py host: switch2.example.net, report: request-package-checks-pending-install rpc is not supported on given device host: switch2.example.net, report: installing software on VC member: 0 ... please be patient ... host: switch2.example.net, report: software pkgadd package-result: 0 Output: Verified junos-install-ex-x86-64-23.2R1.13 signed by PackageProductionECP256_2023 method ECDSA256+SHA256 Verified auto-snapshot signed by PackageProductionECP256_2023 method ECDSA256+SHA256 ...
예: Junos PyEZ를 사용하여 Junos 디바이스에 소프트웨어 설치
Junos PyEZ 라이브러리는 Junos 디바이스에서 운영 및 구성 작업을 수행하는 방법을 제공합니다. 이 예에서는 Junos PyEZ jnpr.junos.utils.sw.SW
유틸리티를 사용하여 Junos 디바이스에 소프트웨어 이미지를 설치하거나 업그레이드하는 방법을 간략하게 설명합니다.
요구 사항
이 예에서 사용되는 하드웨어 및 소프트웨어 구성 요소는 다음과 같습니다.
Python 3.5 이상 및 Junos PyEZ 릴리스 2.5 이상을 실행하는 구성 관리 서버
NETCONF가 활성화된 Junos 디바이스 및 적절한 권한으로 구성된 사용자 계정
Junos PyEZ 서버 및 Junos 디바이스에서 해당 사용자에 대해 구성된 SSH 퍼블릭/프라이빗 키 페어
개요
이 예에서는 Junos PyEZ SW
유틸리티를 사용하여 지정된 디바이스에서 Junos OS를 업그레이드하는 Python 애플리케이션을 보여줍니다. 이 예제에서는 소프트웨어 이미지가 로컬 서버에 있다고 가정합니다.
애플리케이션은 Junos 디바이스와의 연결을 처리하는 Junos PyEZ Device
클래스, SW
대상 디바이스에서 소프트웨어 설치 작업을 수행하는 데 사용되는 클래스 및 Junos 디바이스를 관리할 때 발생하는 예외를 포함하는 모듈의 필수 예외 jnpr.junos.exception
를 가져옵니다. 또한 애플리케이션은 소프트웨어 패키지의 os
존재를 확인하고 기본 로깅 기능을 수행하기 위해 , sys
및 logging
Python 모듈을 가져옵니다.
응용 프로그램은 설치 진행률을 보고하기 위해 메서드에서 install()
사용하는 메서드를 정의합니다update_progress()
. 설치 프로세스를 기록하면 오류가 발생한 지점을 보다 쉽게 식별할 수 있습니다. 이 예제에서 진행률 메시지는 표준 출력으로 전송되고 별도의 파일에도 기록됩니다.
장치에 연결하고 설치를 진행하기 전에 응용 프로그램은 먼저 소프트웨어 패키지가 있는지 확인합니다. 파일을 찾을 수 없는 경우 오류 메시지와 함께 응용 프로그램이 종료됩니다. 파일이 있는 경우 애플리케이션은 대상 디바이스에 대한 인스턴스를 생성하고 Device
메서드를 호출하여 open()
디바이스와의 연결 및 NETCONF 세션을 설정합니다.
애플리케이션은 유틸리티의 SW
인스턴스를 생성하고 이 install()
방법을 사용하여 대상 디바이스에 Junos OS 소프트웨어 이미지를 설치합니다. 이 package
변수는 로컬 서버에서 새 Junos OS 이미지에 대한 경로를 정의합니다. no_copy
매개 변수의 기본값이 False이므로 설치 프로세스에서 소프트웨어 이미지를 로컬 서버에서 대상 장치로 복사합니다. 변수는 remote_path
소프트웨어 패키지가 복사되는 대상 장치의 경로를 정의합니다. 기본값은 /var/tmp입니다. 필수는 아니지만 이 예제에서는 명확성을 위해 매개 변수를 명시적으로 구성합니다.
install()
메서드가 호출되면 응용 프로그램은 다음을 수행합니다.
-
소프트웨어 이미지에 대한 로컬 MD5 체크섬을 계산합니다
-
대상 장치에서 저장소 정리를 수행합니다
-
소프트웨어 이미지를 대상 장치에 복사합니다
-
원격 MD5 체크섬을 계산하여 로컬 값과 비교합니다
-
새 이미지에 대해 구성의 유효성을 검사합니다
-
패키지를 설치합니다
설치에 성공하면 애플리케이션은 메서드를 호출하여 reboot()
디바이스를 다시 부팅합니다. 설치를 수행한 후 애플리케이션은 메서드를 호출하여 close()
NETCONF 세션 및 연결을 종료합니다. 응용 프로그램에는 장치에 연결하거나 설치를 수행할 때 발생할 수 있는 예외를 처리하기 위한 코드가 포함되어 있습니다.
구성
Junos PyEZ 애플리케이션 생성
단계별 절차
Junos PyEZ를 사용하여 Junos 디바이스에 소프트웨어 이미지를 설치하는 Python 애플리케이션을 생성하려면 다음을 수행합니다.
필요한 모듈, 클래스 및 개체를 가져옵니다.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError
이 예에서는 매니지드 디바이스의 호스트 이름, 소프트웨어 패키지 경로 및 로그 파일을 포함하는 모든 필수 변수를 포함합니다.
host = 'dc1a.example.com' package = '/var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz' remote_path = '/var/tmp' validate = True logfile = '/var/log/junos-pyez/install.log'
-
응용 프로그램 내에서 사용되는 로깅 방법과 메서드에서
install()
사용하는 로깅 방법을 정의합니다.def update_progress(dev, report): # log the progress of the installing process logging.info(report)
main()
함수 정의 및 함수 호출을 만들고 나머지 명령문을 정의 내에 배치합니다.def main(): if __name__ == "__main__": main()
로거 인스턴스를 초기화합니다.
# initialize logging logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s:%(name)s: %(message)s') logging.getLogger().name = host logging.getLogger().addHandler(logging.StreamHandler()) logging.info('Information logged in {0}'.format(logfile))
(선택 사항) 소프트웨어 패키지의 존재를 확인하는 코드를 추가합니다.
# verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit()
클래스의 인스턴스를
Device
만들고 해당 특정 연결에 필요한 호스트 이름과 매개 변수를 제공합니다.그런 다음 연결을 열고 디바이스와의 NETCONF 세션을 설정합니다.
# open a connection with the device and start a NETCONF session dev = Device(host=host) try: dev.open() except ConnectError as err: logging.error('Cannot connect to device: {0}\n'.format(err)) return
유틸리티의
SW
인스턴스를 만듭니다.# Create an instance of SW sw = SW(dev)
소프트웨어 패키지를 설치하고 설치에 성공하면 디바이스를 재부팅하는 코드를 포함합니다.
try: logging.info('Starting the software upgrade process: {0}' \ .format(package)) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=validate) except Exception as err: msg = 'Unable to install software, {0}'.format(err) logging.error(msg) ok = False if ok is True: logging.info('Software installation complete. Rebooting') rsp = sw.reboot() logging.info('Upgrade pending reboot cycle, please be patient.') logging.info(rsp) else: msg = 'Unable to install software, {0}'.format(ok) logging.error(msg)
NETCONF 세션을 종료하고 디바이스와의 연결을 닫습니다.
# End the NETCONF session and close the connection dev.close()
결과
구성 관리 서버에서 완료된 응용 프로그램을 검토합니다. 응용 프로그램에 의도한 코드가 표시되지 않으면 이 예제의 지침을 반복하여 응용 프로그램을 수정합니다.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError host = 'dc1a.example.com' package = '/var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz' remote_path = '/var/tmp' validate = True logfile = '/var/log/junos-pyez/install.log' def update_progress(dev, report): # log the progress of the installing process logging.info(report) def main(): # initialize logging logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s:%(name)s: %(message)s') logging.getLogger().name = host logging.getLogger().addHandler(logging.StreamHandler()) logging.info('Information logged in {0}'.format(logfile)) # verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit() dev = Device(host=host) try: dev.open() except ConnectError as err: logging.error('Cannot connect to device: {0}\n'.format(err)) return # Create an instance of SW sw = SW(dev) try: logging.info('Starting the software upgrade process: {0}' \ .format(package)) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=validate) except Exception as err: msg = 'Unable to install software, {0}'.format(err) logging.error(msg) ok = False if ok is True: logging.info('Software installation complete. Rebooting') rsp = sw.reboot() logging.info('Upgrade pending reboot cycle, please be patient.') logging.info(rsp) else: msg = 'Unable to install software, {0}'.format(ok) logging.error(msg) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Junos PyEZ 애플리케이션 실행
응용 프로그램 실행
-
구성 관리 서버에서 응용 프로그램을 실행합니다.
user@server:~$ python3 junos-pyez-install.py Information logged in /var/log/junos-pyez/install.log Starting the software upgrade process: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz computing local checksum on: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz cleaning filesystem ... starting thread (client mode): 0x282d4110L Connected (version 2.0, client OpenSSH_6.7) ...
확인
설치 확인
목적
소프트웨어가 성공적으로 설치되었는지 확인합니다.
행동
설치에 대한 세부사항은 표준 출력과 애플리케이션에 정의된 로그 파일 둘 다로 전송되는 진행률 메시지를 검토하십시오. 샘플 로그 파일 출력은 다음과 같습니다. 간결성을 위해 일부 출력이 생략되었습니다.
user@server:~$ cat /var/log/junos-pyez/install.log 2015-09-03 21:29:20,795:dc1a.example.com: Information logged in /var/log/junos-pyez/install.log 2015-09-03 21:29:35,257:dc1a.example.com: Starting the software upgrade process: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:29:35,257:dc1a.example.com: computing local checksum on: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:29:47,025:dc1a.example.com: cleaning filesystem ... 2015-09-03 21:30:00,870:paramiko.transport: starting thread (client mode): 0x282d4110L 2015-09-03 21:30:01,006:paramiko.transport: Connected (version 2.0, client OpenSSH_6.7) ... 2015-09-03 21:30:01,533:paramiko.transport: userauth is OK 2015-09-03 21:30:04,002:paramiko.transport: Authentication (public key) successful! 2015-09-03 21:30:04,003:paramiko.transport: [chan 0] Max packet in: 32768 bytes 2015-09-03 21:30:04,029:paramiko.transport: [chan 0] Max packet out: 32768 bytes 2015-09-03 21:30:04,029:paramiko.transport: Secsh channel 0 opened. 2015-09-03 21:30:04,076:paramiko.transport: [chan 0] Sesch channel 0 request ok 2015-09-03 21:32:23,684:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 94437376 / 944211851 (10%) 2015-09-03 21:34:43,828:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 188858368 / 944211851 (20%) 2015-09-03 21:37:04,180:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 283279360 / 944211851 (30%) 2015-09-03 21:39:24,020:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 377700352 / 944211851 (40%) 2015-09-03 21:41:43,906:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 472121344 / 944211851 (50%) 2015-09-03 21:44:04,079:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 566542336 / 944211851 (60%) 2015-09-03 21:46:23,968:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 660963328 / 944211851 (70%) 2015-09-03 21:48:44,045:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 755384320 / 944211851 (80%) 2015-09-03 21:51:04,016:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 849805312 / 944211851 (90%) 2015-09-03 21:53:24,058:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 944211851 / 944211851 (100%) 2015-09-03 21:53:24,389:paramiko.transport: [chan 0] EOF sent (0) 2015-09-03 21:53:24,466:paramiko.transport: EOF in transport thread 2015-09-03 21:53:24,514:dc1a.example.com: computing remote checksum on: /var/tmp/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:56:01,692:dc1a.example.com: checksum check passed. 2015-09-03 21:56:01,692:dc1a.example.com: validating software against current config, please be patient ... 2015-09-03 22:47:57,205:dc1a.example.com: installing software ... please be patient ... 2015-09-03 23:28:10,415:dc1a.example.com: Software installation complete. Rebooting 2015-09-03 23:28:11,525:dc1a.example.com: Upgrade pending reboot cycle, please be patient. 2015-09-03 23:28:11,525:dc1a.example.com: Shutdown NOW! [pid 55494]
의미
로그 파일 내용은 이미지가 대상 디바이스에 성공적으로 복사되어 설치되었음을 나타냅니다.
문제 해결
시간 초과 오류 문제 해결
문제
응용 프로그램에서 RpcTimeoutError 메시지 또는 TimeoutExpiredError 메시지를 생성하고 설치가 실패합니다.
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
긴 작업은 특히 느린 디바이스에서 RPC 시간 제한 간격을 초과할 수 있으며, 이로 인해 작업이 완료되기 전에 RPC가 시간 초과될 수 있습니다. NETCONF RPC의 시간 초과에 대한 기본 시간은 30초입니다. 설치 과정에서 Junos PyEZ는 체크섬을 계산할 때 RPC 타임아웃 간격을 300초(5분)로, 디바이스에 패키지를 복사 및 설치할 때 1800초(30분)로 늘립니다.
용액
기본 설치 및 체크섬 시간 제한 간격보다 더 긴 시간이 필요할 수 있는 설치 또는 체크섬 작업을 수용하려면 메서드 timeout
및 checksum_timeout
매개 변수를 적절한 값으로 설정하고 install
응용 프로그램을 다시 실행합니다. 예를 들어:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
변경 내역 테이블
기능 지원은 사용 중인 플랫폼 및 릴리스에 따라 결정됩니다. 기능 탐색기 를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.
install()
부터 이 메서드는 설치 상태와 메시지 문자열이 포함된 튜플을 반환합니다.