Ironic/Drivers/iLODrivers/Juno
目录
iLO 驱动程序(Juno)
概述
iLO 驱动程序能够利用惠普 Proliant 服务器中 iLO 管理引擎的特性。iLO 驱动程序面向 HP Proliant Gen 8 系统及更高版本,这些系统具有 iLO 4 管理引擎。
目前有3个iLO驱动程序
iscsi_ilo 和 agent_ilo 驱动程序通过使用 iLO 虚拟媒体启动裸机节点,提供安全性增强的无 PXE 部署。这些驱动程序通过管理通道发送管理信息,并将其与用于部署的数据通道分开。iscsi_ilo 驱动程序使用从 diskimage-builder 构建的部署 ramdisk,从 Ironic conductor 节点部署,并且始终执行网络启动。agent_ilo 驱动程序使用从 IPA 构建的部署 ramdisk,从裸机节点部署,并且始终执行本地启动。
pxe_ilo驱动程序使用PXE/iSCSI进行部署(就像普通的PXE驱动程序一样),但支持从nova自动设置请求的启动模式。此驱动程序不需要iLO Advanced许可证。
先决条件
- proliantutils 是一个 Python 包,包含用于管理 HP Proliant 硬件的一组模块。在 Ironic conductor 节点上安装 proliantutils 模块。最低版本要求为 0.1.0。推荐版本为 2.1.5。
$ pip install "proliantutils>=2.1.5"
- ipmitool 命令必须存在于运行 ironic-conductor 的服务节点上。在大多数发行版中,这作为 ipmitool 包的一部分提供。源代码可在 http://ipmitool.sourceforge.net/ 上找到。
驱动程序
iscsi_ilo 驱动程序
概述
iscsi_ilo 驱动程序作为 HP Proliant 服务器的 pxe_ipmitool 和 pxe_ipminative 驱动程序的替代方案引入。iscsi_ilo 使用 iLO 中的虚拟媒体功能启动裸机节点,而不是使用 PXE 或 iPXE。
目标用户
- 不想在其数据中心使用 PXE/TFTP 协议的用户。
- 关注 PXE 驱动程序安全问题的用户,并希望拥有安全性增强的无 PXE 部署机制 - PXE 驱动程序以明文形式将管理信息传递到裸机节点。但是,如果 Swift 代理服务器具有 HTTPS 端点(有关更多信息,请参阅 启用 Swift 中的 HTTPS),则 iscsi_ilo 驱动程序通过通过 HTTPS 通过 iLO 虚拟媒体将管理信息与 Swift 端点之间进行传输,从而提供增强的安全性。管理信息和启动镜像将通过加密的管理网络进行检索。
已测试平台
此驱动程序应适用于具有iLO 4的HP Proliant Gen8服务器及更高版本。
它已使用以下服务器进行了测试
- ProLiant DL380e Gen8
- ProLiant DL580e Gen8
- ProLiant DL180 Gen9 UEFI
- ProLiant DL380 Gen9 UEFI
- ProLiant DL580 Gen9 UEFI
特性
- 使用虚拟媒体进行无 PXE 部署。
- 自动检测当前启动模式。
- 如果 nova flavor 的 extra spec 请求 UEFI 启动模式,则自动设置所需的启动模式。
- 始终使用虚拟媒体从网络启动。
- UEFI 启动支持
- 如果 Swift 代理服务器具有 HTTPS 端点,则通过安全、加密的管理网络(虚拟媒体)传递管理信息。有关更多信息,请参阅 启用 Swift 中的 HTTPS。通过数据网络使用 iSCSI 进行配置,因此该驱动程序具有与相同性能的安全增强优势。它将管理信息与数据通道分开。
- 远程控制台
- 硬件传感器
- 适用于资源受限的机器(内存较少)。
需求
- iLO 4 Advanced License需要安装在iLO上才能启用虚拟媒体功能。
- Swift 对象存储服务 - iLO 驱动程序使用 Swift 存储临时 FAT 镜像以及启动 ISO 镜像。
- 具有 Swift 配置为其后端的 Glance 镜像服务 - 使用 iscsi_ilo 驱动程序时,包含部署 ramdisk 的镜像将由 iLO 直接从 Swift 检索。
部署过程
- 管理员为 iscsi_ilo 驱动程序配置 Proliant 裸机节点。配置的 Ironic 节点将在其 driver_info 中具有 ilo_deploy_iso 属性。这将包含部署 ramdisk 镜像的 Glance UUID。
- Ironic 收到请求,在裸机节点上部署 Glance 镜像。
- iscsi_ilo 驱动程序关闭裸机节点。
- 驱动程序生成部署 ramdisk 镜像的 swift-temp-url,并将其作为虚拟媒体 CDROM 附加到 iLO 上。
- 驱动程序创建一个包含部署 ramdisk 参数的小型 FAT32 镜像。此镜像上传到 Swift,其 swift-temp-url 作为虚拟媒体软盘附加到 iLO 上。
- 驱动程序将节点设置为从 CDROM 一次性启动。
- 驱动程序启动裸机节点。
- 部署内核/ramdisk 在裸机节点上启动。ramdisk 通过 iSCSI 暴露本地磁盘,并请求 Ironic conductor 完成部署。
- Ironic conductor 上的驱动程序将 glance 镜像写入裸机节点的磁盘。
- 驱动程序将 Glance 部署镜像的启动内核/ramdisk 捆绑到 ISO 中,然后将其上传到 Swift。此 ISO 镜像将用于启动部署的实例。
- 驱动程序重新启动节点。
- 在第一次和后续重新启动时,iscsi_ilo 驱动程序将 Swift 中的此启动 ISO 镜像作为虚拟媒体 CDROM 附加,然后将 iLO 设置为从其启动。
配置和启用驱动程序
1. 使用 diskimage-builder 准备 ISO 部署 ramdisk 镜像。可以通过将 iso 元素添加到 ramdisk-image-create 命令来完成。此命令创建部署内核/ramdisk 以及包含部署内核和 ramdisk 的可启动 ISO 镜像。以下命令在当前工作目录中创建名为 deploy-ramdisk.kernel、deploy-ramdisk.initramfs 和 deploy-ramdisk.iso 的文件
pip install diskimage-builder ramdisk-image-create -o deploy-ramdisk ubuntu deploy-ironic iso
2. 将此镜像上传到 Glance:
glance image-create --name deploy-ramdisk.iso --disk-format iso --container-format bare < deploy-ramdisk.iso
3. 配置 Glance 镜像服务,使其存储后端为 Swift。有关配置说明,请参阅 [4]。
4. 为 Swift 中的 Glance 用户设置 temp-url 密钥。例如,如果您已将 Glance 配置为用户 glance-swift 和租户为 service,则运行以下命令:
swift --os-username=service:glance-swift post -m temp-url-key:mysecretkeyforglance
5. 填写 /etc/ironic/ironic.conf 的 [glance] 部分中所需的参数。通常需要填写以下详细信息:
[glance] swift_temp_url_key=mysecretkeyforglance swift_endpoint_url=http://10.10.1.10:8080 swift_api_version=v1 swift_account=AUTH_51ea2fb400c34c9eb005ca945c0dc9e1 swift_container=glance
可以通过运行以下命令检索这些详细信息
$ swift --os-username=service:glance-swift stat -v | grep -i url StorageURL: http://10.10.1.10:8080/v1/AUTH_51ea2fb400c34c9eb005ca945c0dc9e1 Meta Temp-Url-Key: mysecretkeyforglance
6. Swift 必须使用在 Ironic 中配置的相同管理员凭据进行访问。例如,如果 Ironic 在 /etc/ironic/ironic.conf 中配置了以下凭据:
[keystone_authtoken] admin_password = password admin_user = ironic admin_tenant_name = service auth_version = 2
那么,以下命令应该可以工作:
$ swift --os-username ironic --os-password password --os-tenant-name service --auth-version 2 stat
Account: AUTH_22af34365a104e4689c46400297f00cb
Containers: 2
Objects: 18
Bytes: 1728346241
Objects in policy "policy-0": 18
Bytes in policy "policy-0": 1728346241
Meta Temp-Url-Key: mysecretkeyforglance
X-Timestamp: 1409763763.84427
X-Trans-Id: tx51de96a28f27401eb2833-005433924b
Content-Type: text/plain; charset=utf-8
Accept-Ranges: bytes
7. 将 iscsi_ilo 添加到 /etc/ironic/ironic.conf 中的 enabled_drivers 列表中。例如::
enabled_drivers = fake,pxe_ssh,pxe_ipmitool,iscsi_ilo
8. 重新启动 Ironic conductor 服务。
$ service ironic-conductor restart
在 Ironic 中注册 Proliant 节点
配置为 iLO 驱动程序的节点应将 driver 属性设置为 iscsi_ilo。以下配置值也需要在 driver_info 中需要
- ilo_address:iLO 的 IP 地址或主机名。
- ilo_username:具有管理员权限的 iLO 用户名。
- ilo_password:上述 iLO 用户的密码。
- ilo_deploy_iso:部署 ramdisk ISO 镜像的 Glance UUID。
- client_port:(可选)如果在 iLO 上使用自定义端口,则用于 iLO 操作的端口。默认使用的端口是 443。
- client_timeout:(可选)iLO 操作的超时时间。默认超时时间为 60 秒。
- console_port:(可选)节点用于控制台访问的 UDP 端口。Ironic conductor 节点上的任何未使用的端口均可使用。
启动模式
iscsi_ilo 驱动程序支持自动检测和设置启动模式(传统 BIOS 或 UEFI)。
- 如果未提供启动模式设置,iscsi_ilo 驱动程序将保留部署实例上的当前启动模式。
- 可以通过将 boot_mode:bios 或 boot_mode:uefi 添加到 Ironic 节点 properties 字段中的 capabilities 属性中来提供特定启动模式的要求。然后,iscsi_ilo 驱动程序将以适当的启动模式部署和配置实例。
例如,要使 Proliant 裸机节点以 UEFI 模式启动,请运行以下命令:
ironic node-update <node-id> add properties/capabilities='boot_mode:uefi'
注意:
- 我们建议在支持 UEFI 和传统模式的系统上设置 boot_mode 属性,如果用户希望 Nova 能够选择具有适当启动模式的裸机节点,则可以这样做。适用于 ProLiant DL580 Gen8 和 Gen9 系统。
- iscsi_ilo 驱动程序自动将启动模式从 BIOS 更改为 UEFI,如果 Nova 启动中的请求启动模式为 UEFI。但是,如果用户希望以传统模式部署节点,则需要在 DL580 Gen8 和 Gen9 服务器上预先配置启动模式为传统模式。
- 目前,对于 UEFI 启动模式,不支持自动创建启动 ISO。部署镜像的启动 ISO 需要单独构建,并且 Glance 中的部署镜像的 boot_iso 属性应包含启动 ISO 的 Glance UUID。要构建启动 ISO,请在用 diskimage-builder 构建磁盘镜像时,在添加裸机元素之后添加 iso 元素
disk-image-create ubuntu baremetal iso
- 可以通过使用 ComputeCapabilitesFilter 从 nova 请求特定的启动模式。例如,可以在 flavor 中如下设置:
nova flavor-key ironic-test-3 set capabilities:boot_mode="uefi" nova boot --flavor ironic-test-3 --image test-image instance-1
agent_ilo 驱动程序
概述
agent_ilo 驱动程序作为 HP Proliant 服务器的 agent_ipmitool 和 agent_ipminative 驱动程序的替代方案引入。agent_ilo 驱动程序使用 HP Proliant 裸机服务器中的虚拟媒体功能启动 Ironic Python Agent (IPA) 到裸机节点,而不是使用 PXE。有关 IPA 的更多信息,请参阅 https://wiki.openstack.org/wiki/Ironic-python-agent。
目标用户
- 不想在其数据中心使用 PXE/TFTP 协议的用户。
- 如果 Swift 代理服务器具有 HTTPS 端点,则通过安全、加密的管理网络(虚拟媒体)传递管理信息。有关更多信息,请参阅 启用 Swift 中的 HTTPS。通过数据网络使用 iSCSI 进行配置,因此该驱动程序具有与相同性能的安全增强优势。它将管理信息与数据通道分开。
已测试平台
此驱动程序应适用于具有iLO 4的HP Proliant Gen8服务器及更高版本。
它已使用以下服务器进行了测试
- ProLiant DL380e Gen8
- ProLiant DL180 Gen9
特性
- 使用 Ironic Python Agent 进行无 PXE 部署。
- 远程控制台
- 硬件传感器
- IPA在裸机节点上运行,并直接从Swift提取镜像。
- IPA 部署的实例始终从本地磁盘启动。
- 将管理信息与数据通道隔离。
需求
- iLO 4 Advanced License需要安装在iLO上才能启用虚拟媒体功能。
- Swift 对象存储服务 - iLO 驱动程序使用 Swift 存储临时 FAT 镜像以及启动 ISO 镜像。
- 具有 Swift 配置为其后端的 Glance 镜像服务 - 使用 iscsi_ilo 驱动程序时,包含部署 ramdisk 的镜像将由 iLO 直接从 Swift 检索。
部署过程
- 管理员为 agent_ilo 驱动程序配置 Proliant 裸机节点。配置的 Ironic 节点将在其 driver_info 中具有 ilo_deploy_iso 属性。这将包含包含代理的 ISO 部署代理镜像的 Glance UUID。
- Ironic 收到请求,在裸机节点上部署 Glance 镜像。
- 驱动程序关闭裸机节点。
- 驱动程序生成部署代理镜像的 swift-temp-url,并将其作为虚拟媒体 CDROM 附加到 iLO 上。
- 驱动程序创建一个包含代理 ramdisk 参数的小型 FAT32 镜像。此镜像上传到 Swift,其 swift-temp-url 作为虚拟媒体软盘附加到 iLO 上。
- 驱动程序将节点设置为从 CDROM 一次性启动。
- 驱动程序启动裸机节点。
- 包含代理的部署内核/ramdisk 在裸机节点上启动。代理 ramdisk 与 Ironic conductor 通信,直接从 Swift 下载镜像,并将镜像写入节点的磁盘。
- 驱动程序将节点设置为永久从磁盘启动,然后重新启动节点。
配置和启用驱动程序
1. 使用 [5]_ 中的 iso-image-create 脚本准备包含 agent 的 ISO 部署 Ironic Python Agent 镜像。以下命令将在以下目录 UPLOAD 中创建一个名为 ipa-ramdisk.iso 的文件:
$ cd <directory-containing-ironic-python-agent> $ cd ./imagebuild/coreos $ make iso $ cd UPLOAD $ ls $ coreos_production_pxe_image-oem.cpio.gz coreos_production_pxe.vmlinuz ipa-coreos.iso
2. 将 IPA ramdisk 镜像上传到 Glance:
glance image-create --name ipa-ramdisk.iso --disk-format iso --container-format bare < ipa-coreos.iso
3. 将 Glance 镜像服务配置为使用 Swift 作为其存储后端。请参阅 [4]_ 获取配置说明。4. 为 Swift 中的 Glance 用户设置 temp-url 密钥。例如,如果您已将 Glance 配置为用户 glance-swift 和租户为 service,则运行以下命令:
swift --os-username=service:glance-swift post -m temp-url-key:mysecretkeyforglance
5. 填写 /etc/ironic/ironic.conf 的 [glance] 部分中所需的参数。通常需要填写以下详细信息:
[glance] swift_temp_url_key=mysecretkeyforglance swift_endpoint_url=http://10.10.1.10:8080 swift_api_version=v1 swift_account=AUTH_51ea2fb400c34c9eb005ca945c0dc9e1 swift_container=glance
The details can be retrieved by running the below command:::
$ swift --os-username=service:glance-swift stat -v | grep -i url StorageURL: http://10.10.1.10:8080/v1/AUTH_51ea2fb400c34c9eb005ca945c0dc9e1 Meta Temp-Url-Key: mysecretkeyforglance
6. Swift 必须使用在 Ironic 中配置的相同管理员凭据进行访问。例如,如果 Ironic 在 /etc/ironic/ironic.conf 中配置了以下凭据:
[keystone_authtoken] admin_password = password admin_user = ironic admin_tenant_name = service
确保 keystone_authtoken 中的 auth_version 为 2。
那么,以下命令应该可以工作:
$ swift --os-username ironic --os-password password --os-tenant-name service --auth-version 2 stat
Account: AUTH_22af34365a104e4689c46400297f00cb
Containers: 2
Objects: 18
Bytes: 1728346241
Objects in policy "policy-0": 18
Bytes in policy "policy-0": 1728346241
Meta Temp-Url-Key: mysecretkeyforglance
X-Timestamp: 1409763763.84427
X-Trans-Id: tx51de96a28f27401eb2833-005433924b
Content-Type: text/plain; charset=utf-8
Accept-Ranges: bytes
7. 将 agent_ilo 添加到 /etc/ironic/ironic.conf 中的 enabled_drivers 列表中。例如::
enabled_drivers = fake,pxe_ssh,pxe_ipmitool,agent_ilo
8. 重新启动 Ironic conductor 服务:
$ service ironic-conductor restart
在 Ironic 中注册 Proliant 节点
配置为 iLO 驱动程序的节点应将 driver 属性设置为 agent_ilo。以下配置值也需要在 driver_info 中需要
- ilo_address:iLO 的 IP 地址或主机名。
- ilo_username:具有管理员权限的 iLO 用户名。
- ilo_password:上述 iLO 用户的密码。
- ilo_deploy_iso:包含 agent 的 deploy agent ISO 镜像的 Glance UUID。
- client_port:(可选)如果在 iLO 上使用自定义端口,则用于 iLO 操作的端口。默认使用的端口是 443。
- client_timeout:(可选)iLO 操作的超时时间。默认超时时间为 60 秒。
- console_port:(可选)节点用于控制台访问的 UDP 端口。Ironic conductor 节点上的任何未使用的端口均可使用。
注意:
- 我们建议在支持 UEFI 和传统模式的系统上设置 boot_mode 属性,如果用户希望 Nova 能够选择具有适当启动模式的裸机节点,则可以这样做。适用于 ProLiant DL580 Gen8 和 Gen9 系统。
- agent_ilo 驱动程序自动将启动模式从 BIOS 更改为 UEFI,如果 Nova 启动中的请求启动模式为 UEFI。但是,如果用户希望以传统模式部署节点,则需要在 DL580 Gen8 和 Gen9 服务器上预先配置启动模式为传统模式。
- 可以通过使用 ComputeCapabilitesFilter 从 nova 请求特定的启动模式。例如,可以在 flavor 中如下设置:
nova flavor-key ironic-test-3 set capabilities:boot_mode="uefi" nova boot --flavor ironic-test-3 --image test-image instance-1
pxe_ilo 驱动程序
概述
pxe_ilo 驱动程序使用 PXE/iSCSI(就像 pxe_ipmitool 驱动程序一样)来部署镜像,并使用 iLO 来执行裸机节点上的所有管理操作(而不是使用 IPMI)。
目标用户
- 希望在其环境中对部署使用 PXE/iSCSI 或 iLO 中没有高级许可证的用户。
- 不希望手动配置裸机节点上启动模式的用户。
已测试平台
此驱动程序应适用于具有 iLO 4 的 HP Proliant Gen8 服务器及更高版本。它已使用以下服务器进行测试
- ProLiant DL380e Gen8
- ProLiant DL380e Gen8
- ProLiant DL580 Gen8
- ProLiant DL180 Gen9
特性
- 自动检测当前启动模式。
- 如果 nova flavor 的 extra spec 请求 UEFI 启动模式,则自动设置所需的启动模式。
需求
无。
配置和启用驱动程序
1. 使用 diskimage-builder 准备 ISO 部署 ramdisk 镜像。以下命令在当前工作目录中创建名为 deploy-ramdisk.kernel 和 deploy-ramdisk.initramfs 的文件:
pip install diskimage-builder ramdisk-image-create -o deploy-ramdisk ubuntu deploy-ironic
2. 将此镜像上传到 Glance:
glance image-create --name deploy-ramdisk.kernel --disk-format aki --container-format aki < deploy-ramdisk.kernel glance image-create --name deploy-ramdisk.initramfs --disk-format ari --container-format ari < deploy-ramdisk.initramfs
7. 将 pxe_ilo 添加到 /etc/ironic/ironic.conf 中 enabled_drivers 列表。
enabled_drivers = fake,pxe_ssh,pxe_ipmitool,pxe_ilo
8. 重新启动 Ironic conductor 服务:
service ironic-conductor restart
在 Ironic 中注册 Proliant 节点
配置为 iLO 驱动程序的节点应将 driver 属性设置为 pxe_ilo。以下配置值也需要在 driver_info 中
- ilo_address:iLO 的 IP 地址或主机名。
- ilo_username:具有管理员权限的 iLO 用户名。
- ilo_password:上述 iLO 用户的密码。
- pxe_deploy_kernel:部署内核的 Glance UUID。
- pxe_deploy_ramdisk:部署 ramdisk 的 Glance UUID。
- client_port:(可选)如果在 iLO 上使用自定义端口,则用于 iLO 操作的端口。默认使用的端口是 443。
- client_timeout:(可选)iLO 操作的超时时间。默认超时时间为 60 秒。
- console_port:(可选)节点用于控制台访问的 UDP 端口。Ironic conductor 节点上的任何未使用的端口均可使用。
启动模式
pxe_ilo 驱动程序支持自动检测和设置启动模式(传统 BIOS 或 UEFI)。
- 如果未提供启动模式设置,pxe_ilo 驱动程序将保留部署实例上的当前启动模式。
- 可以通过将 boot_mode:bios 或 boot_mode:uefi 添加到 Ironic 节点 properties 字段中的 capabilities 属性来提供特定启动模式的要求。然后 pxe_ilo 驱动程序将以适当的启动模式部署和配置实例:
ironic node-update <NODE-ID> add properties/capabilities='boot_mode:uefi'
注意:
- 我们建议在支持 UEFI 和传统模式的系统上设置 boot_mode 属性,如果用户希望 Nova 能够选择具有适当启动模式的裸机节点,则可以这样做。适用于 ProLiant DL580 Gen8 和 Gen9 系统。
- pxe_ilo 驱动程序会自动将启动模式从 BIOS 更改为 UEFI,如果 nova boot 中请求的启动模式为 UEFI。但是,如果用户希望以传统模式部署节点,则需要在 DL580 Gen8 和 Gen9 服务器上预配置启动模式为传统模式。
- 可以通过使用 ComputeCapabilitesFilter 从 nova 请求特定的启动模式。例如,可以在 flavor 中如下设置:
nova flavor-key ironic-test-3 set capabilities:boot_mode="uefi" nova boot --flavor ironic-test-3 --image test-image instance-1
已知问题
| 序号 | 固件版本 | 已知问题 | 解决方案 |
|---|---|---|---|
| 1 | BIOS 系统 ROM 版本 1.20 | 在 Gen9 服务器上部署失败,因为 iLO 不会遵守一次性启动设备设置,而是尝试从持久启动设备启动。 | 这是由于 BIOS 系统 ROM 中的缺陷造成的。从 2015 年 5 月 13 日的固件版本 1.32_03-05-2015 开始提供修复。 |
| 2 | Smart Array SAS 驱动程序 v8.03 | 基于 Fedora 的 IPA 部署 ramdisk ISO 在出现“error: can't allocate initrd”错误时无法启动,如果基于 P220 的智能阵列控制器连接到 ProLiant 服务器。 | 这是 P220 基于智能阵列的固件中的 Fishman 驱动程序问题。该缺陷已提交到 Fishman 固件。驱动程序补丁将很快提供。 |
| 3 | iLO 版本 2.20 | 使用 iLO 驱动程序中的任何一个在 Gen9 服务器上部署都可能失败,并在 conductor 日志中出现“Invalid Device Choice”错误,同时设置持久启动设备。此问题仅在 Gen9 服务器运行 iLO 固件版本 2.20 时发生 | 此问题在于 iLO 固件,如果在 Gen9 服务器上使用 RIBCL 更新 UEFI 启动模式下的持久启动设备,则会以上述错误消息失败。可以通过以下方法之一解决此问题:- A. 将 iLO 固件版本降级到 2.10 或升级到高于 2.20 的版本 B. 将 python 包 'proliantutils' 升级到版本大于或等于 2.1.3。此问题已通过增强 'proliantutils' 以使用 HP REST 接口来更新 Gen9 服务器的持久启动设备而得到解决。 $ sudo pip install "proliantutils>=2.1.3" |
参考文献
- [1] HP iLO 4 用户指南 - http://h20628.www2.hp.com/km-ext/kmcsdirect/emr_na-c03334051-12.pdf
- [2] Proliantutils 模块 - https://pypi.python.org/pypi/proliantutils
- [3] DiskImage-Builder - https://github.com/openstack/diskimage-builder
- [4] https://docs.openstack.org/developer/glance/configuring.html#configuring-the-swift-storage-backend
- [5] Ironic Python Agent - https://github.com/openstack/ironic-python-agent