使用 Junos PyEZ 在 Junos 设备上安装软件
Junos PyEZ jnpr.junos.utils.sw.SW 实用程序允许您在 Junos 设备上安装或升级软件映像。该方法 install() 安装指定的软件包。
本主题讨论支持的部署方案、如何指定软件映像位置以及使用 Junos PyEZ 升级设备时的常规安装过程和选项。它还讨论了如何使用 Junos PyEZ 在支持这些功能的设备上执行更专业的升级方案,例如虚拟机主机升级、统一不中断服务的软件升级(统一 ISSU)或不间断软件升级 (NSSU)。
支持的部署方案
Junos PyEZ jnpr.junos.utils.sw.SW 实用程序允许您在单个 Junos 设备上或混合或非混合虚拟机箱中的成员上安装或升级软件映像。支持以下方案:
-
具有单个路由引擎的独立设备
-
配备双路由引擎的独立设备
-
混合和非混合模式配置中的 EX 系列虚拟机箱
-
混合和非混合模式配置中的 QFX 系列虚拟机箱
-
混合 EX 系列和 QFX 系列虚拟机箱
-
具有虚拟机主机支持的路由引擎上的虚拟机主机升级
-
启用了某种形式的 不中断服务 功能(如统一 ISSU 或 NSSU)的部署配置
从 Junos PyEZ 2.6.8 版开始,您可以使用参数 member_id 在 EX 系列虚拟机箱的特定成员上安装软件包。
该 jnpr.junos.utils.sw.SW 实用程序不支持升级 MX 系列虚拟机箱、SRX 系列机箱群集或虚拟机箱结构 (VCF) 中的设备。
如何指定软件映像位置
使用 Junos PyEZ 在 Junos 设备上安装软件时,可以将软件映像下载到配置管理服务器,默认情况下, install() 该方法会在执行安装之前将其复制到目标设备。您还可以指示 install() 该方法安装已驻留在目标设备上或驻留在可从目标设备访问的 URL 上的映像。
表1概述了install()必须根据软件包位置设置的方法参数。必须始终在package方法调用中包含install()或pkg_set参数。
| 软件包位置 |
|
|
|
|---|---|---|---|
| 配置管理服务器 |
省略或设置为 |
文件路径,包括运行 Junos PyEZ 的本地服务器上一个或多个软件包的文件名。 |
(可选)目标设备上一个或多个包将被复制到的目录的路径。默认值为 /var/tmp。 |
| 目标设备 |
设置为 |
软件包的文件名。 |
(可选)目标设备上一个或多个包必须已驻留的目录的路径。默认值为 /var/tmp。 |
| 网址 |
– |
从安装软件包的目标 Junos 设备角度提供的 URL。 |
– |
该 package 参数用于在单个 Junos 设备或非混合虚拟机箱中的成员上安装软件。参数 package 是指定单个软件映像的字符串。例如:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
该 pkg_set 参数用于在混合虚拟机箱中的成员上安装软件。它包含一个字符串列表或元组,用于指定各种虚拟机箱成员所需的软件映像,顺序不分先后。例如:
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 包含参数会导致服务器将软件包复制到目标设备(非混合虚拟机箱中的单个设备或主路由器或交换机),包括 pkg_set 参数会导致服务器将列表中的所有软件包复制到混合虚拟机箱中的主路由器或交换机。默认情况下,软件映像放置在 /var/tmp 目录中,除非 remote_path 参数指定了其他目录。
如果将 no_copy 参数设置为 True,则在安装开始之前,目标设备或虚拟机箱主设备上必须已存在必要的软件包。包必须驻留在参数指定的 remote_path 目录中,或者如果省略,则 remote_path 驻留在默认的 /var/tmp 目录中。
Junos PyEZ 还支持从 URL 安装软件映像。在这种情况下, package 从目标 Junos 设备的角度来看,或 pkg_set 值必须是 URL。包将从指定的 URL 复制并安装,并 no-copy 忽略和 remote_path 参数。有关指定 URL 格式的信息,请参阅在 Junos OS CLI 命令中指定文件名和 URL 的格式。
安装过程概述
要在 Junos 设备上安装软件映像,Junos PyEZ 应用程序可连接到虚拟机箱中的单个设备或主设备,创建实用程序 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"。 -
在目标设备上执行存储清理以便为软件包创建空间,除非
cleanfs设置为False。 -
SCP 或 FTP 将软件包复制到
remote_path目录,如果未指定,则复制到 /var/tmp 目录(如果remote_path具有相同名称和校验和的文件尚未驻留在设备上的目标位置)。 -
计算远程文件的校验和,并将其与本地文件的值进行比较。
软件包位于目标设备上后,无论是最初下载到目标设备上、通过方法从 install() 配置管理服务器复制,还是目标设备 install() 从 URL 复制,该方法都会执行以下操作:
-
如果参数设置为 True,则
validate根据新包验证配置 -
在所有路由引擎上安装软件包,除非
all_re设置为False
从版本 2.1.5 开始,默认情况下,Junos PyEZ 将升级虚拟机箱中单个设备和成员上的所有路由引擎。在早期版本中,或者如果 ,Junos all_re=FalsePyEZ 仅升级其连接的路由引擎。
从 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() 不会自动重新启动设备。要在安装完成后重新启动或关闭设备,请分别调用 reboot() 或 shutdown() 方法。
以下视频演示了一个简短的 Python 会话,演示了如何使用 Junos PyEZ 安装 Junos OS。
如何指定安装和校验和超时
Junos PyEZ 通过 NETCONF 会话执行操作。NETCONF RPC 超时的默认时间为 30 秒。在安装过程中,在设备上复制并安装软件包时,Junos PyEZ 会将 RPC 超时间隔增加到 1800 秒(30 分钟),在计算校验和时增加到 300 秒(5 分钟)。在某些情况下,安装过程或校验和计算可能会超过这些时间间隔。
若要增加安装过程和校验和计算的超时值,请在对方法的install()调用中分别包含timeout和checksum_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 安装过程使您能够通过在方法调用中包含install()参数来progress显示或记录安装进度。该参数设置为回调函数,该函数必须定义一个包含实例和报表字符串参数的Device函数原型。您还可以设置为progress=True用于sw.progress()基本报告。
以下示例使用该 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 主机升级
在具有支持虚拟机主机的路由引擎的设备上,Junos OS 在基于 Linux 的主机(虚拟机主机)上作为虚拟机 (VM) 运行。虚拟机主机升级需要虚拟机主机安装包 (junos-vmhost-install-x.tgz),并升级主机操作系统和兼容的 Junos 操作系统。升级是使用与 <request-vmhost-package-add> RPC 对应的操作模式命令执行request vmhost software add的。
从 Junos PyEZ 2.1.6 版开始,sw.install()该方法支持vmhost=True用于执行虚拟机主机升级的参数。当参数存在时vmhost=True,sw.install()该方法使用 RPC 而不是 <request-package-add> RPC 执行<request-vmhost-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 软件,请调用 sw.reboot() 不带 vmhost 参数的方法。
如何执行统一的 ISSU 或 NSSU
Junos PyEZ 支持在支持该功能并满足必要要求的设备上执行统一不中断服务的软件升级(统一 ISSU)或不间断软件升级 (NSSU)。 表 2 概述了首次支持统一 ISSU 和 NSSU 功能的 Junos PyEZ 版本。有关统一 ISSU 和 NSSU 的详细信息,请参阅产品的软件文档。
| Junos PyEZ 版本 |
功能支持 |
|---|---|
| 2.1.0 |
在双路由引擎 Junos 设备上支持统一的 ISSU 和 NSSU。 |
| 2.1.6 |
对于使用命令执行 |
统一的 ISSU 功能使您能够在两个不同的 Junos OS 版本之间进行升级,而不会中断控制平面,并将流量中断降至最低。若要在支持此功能的设备上执行统一的不中断服务软件升级,请在方法中包含issu=Trueinstall()参数。
在以下示例中, 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 的虚拟机主机支持的路由引擎上执行统一的不中断服务软件升级,请在方法中包含 install() 和 vmhost=True issu=True 参数。设备使用 RPC 从一个<request-vmhost-package-in-service-upgrade>主机操作系统和 Junos OS 版本升级到请求的版本。
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
借助 NSSU 功能,您可以使用冗余路由引擎升级交换机或虚拟机箱上运行的 Junos OS 软件,同时将对网络流量的干扰降至最低。若要在支持此功能的设备上执行不间断软件升级,请在方法中包含nssu=Trueinstall()参数。例如:
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 系列虚拟机箱成员上安装软件
通常,升级非混合 EX 系列虚拟机箱时,请按照 安装过程概述 中概述的安装过程升级整个虚拟机箱。但是,有时您可能需要在虚拟机箱中的特定成员交换机上安装软件。从 Junos PyEZ 版本 2.6.8 开始,您可以使用参数 member_id 在 EX 系列虚拟机箱中的单个成员交换机上安装软件包。参数 member_id 是一个字符串列表,指定要在其上安装软件的成员 ID。
例如,以下 Junos PyEZ 应用程序将升级 EX 系列虚拟机箱中成员 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 公钥/私钥对
概述
此示例演示了一个 Python 应用程序,该应用程序使用 Junos PyEZ SW 实用程序升级指定设备上的 Junos OS。此示例假定软件映像驻留在本地服务器上。
应用程序将导入 Junos PyEZ Device 类,用于处理与 Junos 设备的 SW 连接;该类,用于在目标设备上执行软件安装操作;以及模块中的 jnpr.junos.exception 必需例外,其中包含管理 Junos 设备时遇到的异常。该应用程序还会导入 os、 sys和 logging Python 模块,用于验证软件包是否存在并执行基本的日志记录功能。
应用程序定义 update_progress() 方法,该方法使用该方法报告 install() 安装进度。通过记录安装过程,您可以更轻松地确定发生任何故障的点。在此示例中,进度消息将发送到标准输出,并记录在单独的文件中。
在连接到设备并继续安装之前,应用程序首先验证软件包是否存在。如果找不到该文件,应用程序将退出并显示错误消息。如果该文件存在,应用程序将为目标设备创建 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]
意义
日志文件内容指示映像已成功复制到目标设备并安装在目标设备上。
故障 排除
排查超时错误
问题
应用程序生成 Rpc超时错误消息或超时过期错误消息,安装失败。
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() 该方法返回一个元组,其中包含安装状态和消息字符串。