使用 Ansible 在 Junos 设备上安装软件
总结 使用瞻博网络 Ansible 模块在 Junos 设备上安装软件。
使用 Ansible 安装软件
瞻博网络支持使用 Ansible 管理 Junos 设备,并提供允许您在设备上安装或升级软件映像的模块。 表 1 概述了这些模块。
内容集 |
模块名称 |
---|---|
从版本 2.0.0 开始 Juniper.junos
,该 juniper_junos_software
模块将替换模块 junos_install_os
的功能。
以下各节讨论使用模块在 Junos 设备上安装软件包时,如何指定软件映像位置以及常规软件安装过程和选项。他们还讨论了如何在支持这些功能的设备上执行更专业的升级方案,例如 VM 主机升级、统一不中断服务的软件升级(统一 ISSU)或不间断软件升级 (NSSU)。
如何指定软件映像位置
使用 or juniper_junos_software
模块在 software
Junos 设备上安装软件时,可以将软件包下载到 Ansible 控制节点,默认情况下,模块会在执行安装之前将软件包复制到目标设备。对于混合虚拟机箱环境,软件包必须驻留在 Ansible 控制节点上。对于独立设备或非混合虚拟机箱环境,您还可以指示模块安装已驻留在目标 Junos 设备上或驻留在可从目标设备访问的 URL 上的软件映像。
表 2 概述了必须根据软件包位置设置的模块参数。模块必须始终包含 local_package
、 pkg_set
或 remote_package
参数。参数 no_copy
默认为 false
,指示模块将软件包从控制节点上的指定位置复制到目标设备。
软件包位置 |
|
|
|
---|---|---|---|
Ansible 控制节点 |
省略或设置为 |
对于独立设备或非混合虚拟机箱环境: 设置为 |
(可选)软件包复制到的目标设备上的文件路径。默认目录是 / var/tmp。 如果包含文件名,则必须 |
对于混合虚拟机箱环境: 设置为 |
– |
||
远程定位 |
– |
– |
从安装软件包的目标 Junos 设备角度提供的 URL。 |
目标设备 |
设置为 |
– |
软件包必须已驻留的目标设备上的文件路径。默认目录是 / var/tmp。 |
如果软件包驻留在 Ansible 控制节点上,请包含用于在独立 Junos 设备或非混合虚拟机箱中的成员上安装软件的参数,或者包括local_package
pkg_set
用于在混合虚拟机箱中的成员上安装软件的参数。module 参数指定本地控制节点上一个或多个软件包的绝对或相对文件路径。
参数 local_package
是指定软件映像路径的单个字符串。该 pkg_set
参数包含一个字符串列表,这些字符串为各种虚拟机箱成员指定必要的软件映像路径,顺序不分先后。例如:
pkg_set: - 'software/jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz' - 'software/jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz'
默认情况下,当您包含或local_package
pkg_set
参数时,模块会将所有软件包复制到目标 Junos 设备(单个设备或虚拟机箱主设备)上的 /var/tmp 目录中。如果要将local_package
映像复制到其他目录,请定义remote_package
参数并指定目标目录。remote_package
如果参数包含文件名,则和remote_package
参数的local_package
文件名必须相同,否则模块会生成错误。
如果软件包已驻留在目标 Junos 设备上,则模块必须包含 no_copy: True
参数以及 remote_package
参数,用于指定目标设备上现有软件包的文件路径。如果未指定目录,则 remote_package
默认为 / var/tmp。
如果软件包位于 Ansible 控制节点或目标设备以外的位置,则模块必须包含 remote_package
参数并指定软件包的位置。的值 remote_package
是从目标 Junos 设备的角度看的 URL。有关可接受的 URL 格式的信息,请参阅 在 Junos OS CLI 命令中指定文件名和 URL 的格式。
安装过程概述
要使用 Ansible 在 Junos 设备上安装软件包,请执行 software
或 juniper_junos_software
模块,并提供任何必要的参数。例如:
--- - name: Perform a Junos OS software upgrade hosts: dc1 connection: local gather_facts: no tasks: - name: Upgrade Junos OS juniper.device.software: local_package: "software/jinstall-ppc-17.3R1.10-signed.tgz" no_copy: false validate: True register: response - name: Print the response debug: var: response
执行 software
或 juniper_junos_software
模块时,它将执行以下操作:
软件包到达目标设备上后,无论是最初下载到目标设备上还是由模块复制,模块都会执行以下操作:
如果
validate
参数设置为true
。注意:默认情况下,
software
和juniper_junos_software
模块不会根据现有配置验证软件包或捆绑包,作为添加软件包的先决条件。要确保活动配置适用于新软件映像,请将参数true
设置为validate
。在每个单独的路由引擎上安装软件包,除非
all_re
设置为false
。重新启动每个升级的路由引擎,除非参数
reboot
设置为false
。
software
和juniper_junos_software
模块使您能够通过包含logfile
模块参数来记录安装进度。默认情况下,仅记录严重性级别为“警告”或更高的消息。要记录严重性级别为 INFO 或更高级别的消息(这是常规安装过程记录消息所必需的),请使用或--verbose
命令行选项执行 playbook-v
。
如何指定超时值
瞻博网络软件模块通过 NETCONF 会话执行操作。NETCONF RPC 超时的默认时间为 30 秒。在安装过程中,某些操作会增加 RPC 超时间隔,如下所示:
-
在设备上复制并安装软件包 - 1800 秒(30 分钟)
-
计算校验和 - 300 秒(5 分钟)
-
执行存储清理 - 300 秒(5 分钟)
在某些情况下,安装过程、校验和计算或存储清理可能会超过这些时间间隔。您可以通过在模块的参数列表中将 、 checksum_timeout
和cleanfs_timeout
参数设置为install_timeout
所需的秒数来更改这些操作的超时值。例如:
- name: Upgrade Junos OS juniper.device.software: local_package: "software/jinstall-ppc-17.3R1.10-signed.tgz" validate: True install_timeout: 2000 checksum_timeout: 420 cleanfs_timeout: 600
如何指定没有等效模块参数的安装选项
使用 or software
juniper_junos_software
模块在设备上安装软件时,该模块会为给定的安装参数调用相应的 RPC,例如, <request-package-add>
用于标准 Junos OS 安装的 RPC、用于虚拟机主机升级的 RPC、 <request-vmhost-package-add>
用于统一 ISSU 方案的 RPC 等 <request-package-in-service-upgrade>
。这些模块支持许多安装选项(例如选项 validate
)的显式参数。这些模块还支持该 kwargs
参数,这使您能够包含 RPC 支持但没有等效模块参数的任何其他选项。该 kwargs
参数采用其他受支持选项的键/值对的字典。
有关模块支持的当前选项列表,请参阅该模块的 API 参考文档。有关特定 RPC 的所有可用选项的列表,请参阅等效命令的文档,或在 Junos XML API 资源管理器中搜索 RPC 的请求标记。
模块应仅包含目标 Junos 设备上支持的安装选项。
在以下操作指南中,模块 software
将在目标主机上安装新的软件映像。该模块包含 kwargs
带有 unlink: True
的参数。此参数在成功升级后从目录中删除软件包,等效于 <unlink/>
在 RPC 中包含 <request-package-add>
该选项。
--- - name: Perform a Junos OS software upgrade hosts: router1 connection: local gather_facts: no tasks: - name: Upgrade Junos OS juniper.device.software: local_package: "software/jinstall-ppc-17.3R1.10-signed.tgz" kwargs: unlink: True register: response - name: Print the response debug: var: response
如何执行 VM 主机升级
在具有支持虚拟机主机的路由引擎的设备上,Junos OS 在基于 Linux 的主机(虚拟机主机)上作为虚拟机 (VM) 运行。虚拟机主机升级(用于升级主机操作系统和兼容的 Junos 操作系统)需要虚拟机主机安装包 (junos-vmhost-install-x.tgz),并使用与 <request-vmhost-package-add>
RPC 对应的操作模式命令执行request vmhost software add
。
software
和juniper_junos_software
模块支持vmhost: True
用于执行 VM 主机升级的参数。当参数存在时,模块将使用 <request-vmhost-package-add>
RPC 执行安装。
以下操作指南将升级并重新启动设备上的 Junos OS 和主机 OS:
--- - name: Upgrade VM Hosts hosts: vm_hosts connection: local gather_facts: no tasks: - name: Perform a VM host upgrade juniper.device.software: local_package: "junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz" vmhost: True register: response - name: Print the response debug: var: response
如何执行统一的 ISSU 或 NSSU
software
和juniper_junos_software
模块支持在支持该功能并满足必要要求的设备上执行统一不中断服务的软件升级(统一 ISSU)或不间断软件升级 (NSSU)。有关统一 ISSU 和 NSSU 功能的详细信息,请参阅产品的软件文档。
统一的 ISSU 功能使您能够在两个不同的 Junos OS 版本之间进行升级,而不会中断控制平面,并将流量中断降至最低。要执行统一的不中断服务的软件升级, software
或 juniper_junos_software
模块必须包含 issu: True
参数。例如:
--- - name: Perform a Junos OS software upgrade hosts: mx1 connection: local gather_facts: no tasks: - name: Perform a unified ISSU juniper.device.software: local_package: "junos-install-mx-x86-64-17.2R1.13.tgz" issu: True register: response - name: Print the response debug: var: response
借助 NSSU 功能,您可以使用冗余路由引擎升级交换机或虚拟机箱上运行的 Junos OS 软件,同时将对网络流量的干扰降至最低。若要执行不间断软件升级, software
或 juniper_junos_software
模块必须包含 nssu: True
参数。例如:
--- - name: Perform a Junos OS software upgrade hosts: ex1 connection: local gather_facts: no tasks: - name: Perform an NSSU juniper.device.software: local_package: "jinstall-ex-4300–17.3R1.10-signed.tgz" nssu: True register: response - name: Print the response debug: var: response
示例:使用 Ansible 安装软件
此示例使用集合中的juniper.device
模块在 software
Junos 设备上安装软件映像。
要求
此示例使用以下硬件和软件组件:
-
运行 Ansible 2.10 或更高版本且已安装集合的
juniper.device
配置管理服务器 -
启用了 NETCONF 且用户帐户配置了适当权限的 Junos 设备
-
在 Ansible 控制节点和 Junos 设备上为相应用户配置 SSH 公钥/私钥对
-
定义了所需主机的现有 Ansible 清单文件
概述
此示例提供了一个 Ansible 操作手册,该操作手册使用该模块在 software
指定清单组中的主机上升级 Junos OS。在此示例中,软件映像驻留在 Ansible 控制节点上,模块在安装之前将映像复制到目标设备。该模块没有显式定义 host
参数,因此该模块在默认主机上运行,该主机为 {{ inventory_hostname }}
.
该操作手册包含以下任务: Checking NETCONF connectivity
该任务利用模块尝试 wait_for
使用默认 NETCONF 端口 830 与 Junos 设备建立 NETCONF 会话。如果控制节点在 playbook 执行期间未能与设备建立 NETCONF 会话,则会跳过该设备的剩余任务。
如果 Install Junos OS package
NETCONF 检查成功,该任务将 software
执行模块。该 version
参数定义所需的 Junos OS 版本,因为该版本将由 Junos 设备上的命令报告 show version
。在 playbook 执行期间,模块首先检查设备上是否尚未安装请求的版本。如果请求的版本与当前安装的版本不同,模块将安装请求的版本。
该 local_package
参数定义 Ansible 控制节点上 Junos OS 软件包的路径。在安装过程中,模块在目标设备上执行存储清理操作,将软件映像复制到设备上的 / var/tmp 目录,验证文件的校验和,根据活动配置验证新软件,然后在目标主机上的每个路由引擎上安装软件。默认情况下,模块在安装完成后重新启动每个路由引擎;但是,为清楚起见, software
此任务会显式设置 reboot: True
。
该任务将模块结果存储在变量中 response
,并通知一个处理程序。如果用户未使用检查模式执行 playbook,处理程序将尝试与设备建立会话, wait_reboot
以验证设备是否已重新联机。该 wait_time
变量定义控制节点尝试与设备重新连接的时间长度。
此示例包含 logfile
用于记录安装进度的参数。这对于安装失败时的调试目的以及记录设备上安装的日期和时间非常重要。执行 playbook 的用户必须具有写入指定日志文件的权限。默认情况下,仅记录严重性级别为“警告”或更高的消息。在此示例中,执行 playbook -v
时可以选择记录严重性级别为 INFO 或更高级别的消息以监视安装。
配置
创建 Ansible 剧本
要创建使用该模块在 software
Junos 设备上安装软件映像的操作指南,请执行以下操作:
-
包括剧本和此重头戏的样板文件,该剧在本地执行模块。
--- - name: Install Junos OS hosts: mx1 connection: local gather_facts: no
-
定义或导入任何必要的变量,在本例中,变量包括所需的 Junos OS 版本和新映像的路径等。
vars: OS_version: "20.3R1.8" OS_package: "junos-install-mx-x86-64-20.3R1.8.tgz" pkg_dir: "software" log_dir: "{{ playbook_dir }}" netconf_port: 830 wait_time: 3600
-
(可选)创建一个任务来验证 NETCONF 连接。
tasks: - name: Checking NETCONF connectivity wait_for: host: "{{ inventory_hostname }}" port: "{{ netconf_port }}" timeout: 5
-
创建任务以在设备上安装 Junos OS 软件包并通知处理程序。
- name: Install Junos OS package juniper.device.software: version: "{{ OS_version }}" local_package: "{{ pkg_dir }}/{{ OS_package }}" reboot: True validate: True logfile: "{{ log_dir }}/software.log" register: response notify: - wait_reboot
-
(可选)创建任务以打印模块响应。
- name: Print response debug: var: response
-
创建用于验证设备在重新启动后是否重新联机的处理程序。
处理程序名称应与安装任务中引用的名称相同。
handlers: - name: wait_reboot wait_for: host: "{{ inventory_hostname }}" port: "{{ netconf_port }}" timeout: "{{ wait_time }}" when: not response.check_mode
结果
在 Ansible 控制节点上,查看已完成的操作指南。如果剧本未显示预期的代码,请重复此示例中的说明以更正剧本。
--- - name: Install Junos OS hosts: mx1 connection: local gather_facts: no vars: OS_version: "20.3R1.8" OS_package: "junos-install-mx-x86-64-20.3R1.8.tgz" pkg_dir: "software" log_dir: "{{ playbook_dir }}" netconf_port: 830 wait_time: 3600 tasks: - name: Checking NETCONF connectivity wait_for: host: "{{ inventory_hostname }}" port: "{{ netconf_port }}" timeout: 5 - name: Install Junos OS package juniper.device.software: version: "{{ OS_version }}" local_package: "{{ pkg_dir }}/{{ OS_package }}" reboot: True validate: True logfile: "{{ log_dir }}/software.log" register: response notify: - wait_reboot - name: Print response debug: var: response handlers: - name: wait_reboot wait_for: host: "{{ inventory_hostname }}" port: "{{ netconf_port }}" timeout: "{{ wait_time }}" when: not response.check_mode
执行剧本
要执行剧本,请执行以下操作:
-
ansible-playbook
在控制节点上发出命令,并提供剧本路径和任何所需的选项。user@ansible-cn:~/ansible$ ansible-playbook -v ansible-pb-junos-install-os.yaml Using /etc/ansible/ansible.cfg as config file PLAY [Install Junos OS] **************************************************** TASK [Checking NETCONF connectivity] *************************************** ok: [mx1a.example.com] => {"changed": false, "elapsed": 0, "match_groupdict": {}, "match_groups": [], "path": null, "port": 830, "search_regex": null, "state": "started"} TASK [Install Junos OS package] ******************************************** changed: [mx1a.example.com] => {"changed": true, "check_mode": false, "msg": "Package /home/user/ansible/software/junos-install-mx-x86-64-20.3R1.8.tgz successfully installed. Response from device is: \nVerified junos-install-mx-x86-64-20.3R1.8 signed by PackageProductionECP256_2020 method ECDSA256+SHA256\n [...output truncated...] NOTICE: 'pending' set will be activated at next reboot... Reboot successfully initiated. Reboot message: Shutdown NOW! [pid 83918]"} TASK [Print response] ****************************************************** ok: [mx1a.example.com] => { "response": { "changed": true, "check_mode": false, "failed": false, "msg": "Package /home/user/ansible/software/junos-install-mx-x86-64-20.3R1.8.tgz successfully installed. Response from device is: \nVerified junos-install-mx-x86-64-20.3R1.8 signed by PackageProductionECP256_2020 method ECDSA256+SHA256\nVerified manifest signed by PackageProductionECP256_2020 method ECDSA256+SHA256\n [...output truncated...] NOTICE: 'pending' set will be activated at next reboot... Reboot successfully initiated. Reboot message: Shutdown NOW! [pid 83918]" } } RUNNING HANDLER [wait_reboot] ********************************************** ok: [mx1a.example.com] => {"changed": false, "elapsed": 209, "match_groupdict": {}, "match_groups": [], "path": null, "port": 830, "search_regex": null, "state": "started"} PLAY RECAP ***************************************************************** mx1a.example.com : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
验证
验证安装
目的
验证软件安装是否成功。
行动
剧本输出应指示任何失败的任务。但是,您也可以查看 playbook 中定义的日志文件的内容,了解有关安装的详细信息。此处显示了示例日志文件输出。为简洁起见,省略了一些输出。
user@ansible-cn:~/ansible$ cat software.log 2020-12-11 00:24:49,478 - paramiko.transport - INFO - Connected (version 2.0, client OpenSSH_7.5) 2020-12-11 00:24:49,632 - paramiko.transport - INFO - Authentication (publickey) successful! 2020-12-11 00:24:57,923 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 344145920 / 3441301038 (10%) 2020-12-11 00:25:05,976 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 688275456 / 3441301038 (20%) 2020-12-11 00:25:13,949 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 1032404992 / 3441301038 (30%) 2020-12-11 00:25:22,051 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 1376534528 / 3441301038 (40%) 2020-12-11 00:25:30,357 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 1720664064 / 3441301038 (50%) 2020-12-11 00:25:38,360 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 2064793600 / 3441301038 (60%) 2020-12-11 00:25:46,575 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 2408923136 / 3441301038 (70%) 2020-12-11 00:25:54,983 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 2753052672 / 3441301038 (80%) 2020-12-11 00:26:03,066 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 3097182208 / 3441301038 (90%) 2020-12-11 00:26:11,330 - jnpr.ansible_module.software - INFO - [mx1a.example.com] b'junos-install-mx-x86-64-20.3R1.8.tgz': 3441301038 / 3441301038 (100%) 2020-12-11 00:26:11,331 - jnpr.ansible_module.software - INFO - [mx1a.example.com] after copy, computing checksum on remote package: /var/tmp/junos-install-mx-x86-64-20.3R1.8.tgz ... 2020-12-11 00:26:27,623 - jnpr.ansible_module.software - INFO - [mx1a.example.com] checksum check passed. 2020-12-11 00:26:27,623 - jnpr.ansible_module.software - INFO - [mx1a.example.com] validating software against current config, please be patient ... ... 2020-12-11 00:30:55,725 - jnpr.ansible_module.software - INFO - [mx1a.example.com] software validate package-result: 0 Output: Removing /packages/sets/previous Verified junos-install-mx-x86-64-20.3R1.8 signed by PackageProductionECP256_2020 method ECDSA256+SHA256 Verified manifest signed by PackageProductionECP256_2020 method ECDSA256+SHA256 Checking PIC combinations Adding junos-mx-x86-64-20.3R1.8 ... ... Validating against /config/juniper.conf.gz mgd: commit complete Validation succeeded 2020-12-11 00:30:55,725 - jnpr.ansible_module.software - INFO - [mx1a.example.com] installing software on RE0 ... please be patient ... ... 2020-12-11 00:33:56,203 - jnpr.ansible_module.software - INFO - [mx1a.example.com] software pkgadd package-result: 0 Output: Verified junos-install-mx-x86-64-20.3R1.8 signed by PackageProductionECP256_2020 method ECDSA256+SHA256 ... 2020-12-11 00:33:56,250 - jnpr.ansible_module.software - INFO - [mx1a.example.com] installing software on RE1 ... please be patient ... ... 2020-12-11 00:37:18,562 - jnpr.ansible_module.software - INFO - [mx1a.example.com] software pkgadd package-result: 0 Output: Pushing /var/tmp/junos-install-mx-x86-64-20.3R1.8.tgz to re1:/var/tmp/junos-install-mx-x86-64-20.3R1.8.tgz Verified junos-install-mx-x86-64-20.3R1.8 signed by PackageProductionECP256_2020 method ECDSA256+SHA256 ... <?xml version="1.0" encoding="UTF-8"?><nc:rpc xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:f6f6a59c-fedd-49fc-9cb3-9848f419a5b7"> <request-reboot><both-routing-engines/><in>0</in></request-reboot></nc:rpc>]]>]]> 2020-12-11 00:37:19,880 - ncclient.operations.rpc - INFO - [host mx1a.example.com session-id 46151] Requesting 'CloseSession'
意义
日志文件内容指示映像已成功复制并安装在目标设备上的两个路由引擎上。
Juniper.junos
,该
juniper_junos_software
模块将替换模块
junos_install_os
的功能。