如何使用Ansible或Terraform通过HP iLO自动化安装服务器操作系统
基于HP iLO自动化安装Ubuntu的实现方案
前置准备
- 确保个人PC和目标服务器iLO管理口网络连通,使用的iLO账号具备虚拟介质挂载、电源控制、远程控制台操作权限
- 确认本地存储的Ubuntu镜像文件路径,提前校验哈希值避免镜像损坏
- 提前准备对应Ubuntu版本的自动安装应答文件:20.04及以上版本使用
autoinstall.yaml(适配subiquity安装器),18.04及更早版本使用preseed配置,提前写好磁盘分区、网络配置、默认用户、SSH密钥、软件源等配置,避免安装过程卡在交互步骤 - 控制端(个人PC)提前安装依赖:使用Ansible的话安装
community.general和hpe.ilo集合;使用Terraform的话提前配置好HPE iLO provider
Ansible 实现流程
Ansible更适合全流程编排,支持临时服务启停、状态轮询等长流程操作,不需要额外部署常驻服务:
- 本地启动临时HTTP服务,托管Ubuntu ISO镜像和autoinstall应答文件,供iLO挂载和安装过程拉取:
如果不想启动HTTP服务,也可以通过iLO虚拟介质通道直接挂载本地ISO,不过传输速度慢于HTTP方式,适合千兆以上管理网场景。- name: 启动临时HTTP服务托管安装资源 ansible.builtin.command: > python3 -m http.server 8080 --bind {{ 本地PC在iLO网段的IP }} --directory {{ 本地ISO和应答文件存放目录 }} async: 3600 poll: 0 register: local_http_pid delegate_to: localhost - 调用iLO模块将Ubuntu镜像挂载为服务器的虚拟CD/DVD设备:
- name: 挂载Ubuntu安装镜像到服务器虚拟光驱 hpe.ilo.ilo_virtual_media: baseuri: {{ iLO管理口IP }} username: {{ iLO登录账号 }} password: {{ iLO登录密码 }} image_url: "http://{{ 本地PC在iLO网段的IP }}:8080/{{ Ubuntu镜像文件名 }}" media_type: CD inserted: true delegate_to: localhost - 配置服务器单次从虚拟光驱启动,强制重启进入安装流程:
- name: 设置下次启动项为虚拟光驱 community.general.hpilo_boot: host: {{ iLO管理口IP }} login: {{ iLO登录账号 }} password: {{ iLO登录密码 }} state: boot_once boot_order: cdrom delegate_to: localhost - name: 重启服务器触发安装 community.general.hpilo_power: host: {{ iLO管理口IP }} login: {{ iLO登录账号 }} password: {{ iLO登录密码 }} state: rebooted force: true delegate_to: localhost - 轮询等待安装完成,判断标准为服务器系统IP的22端口(SSH)可正常连通,之后执行清理操作:卸载虚拟介质、恢复本地硬盘为默认启动项、关闭本地临时HTTP服务。
- name: 等待系统安装完成,SSH服务就绪 ansible.builtin.wait_for: host: {{ 服务器操作系统IP }} port: 22 delay: 60 timeout: 1800 - name: 卸载虚拟安装介质 hpe.ilo.ilo_virtual_media: baseuri: {{ iLO管理口IP }} username: {{ iLO登录账号 }} password: {{ iLO登录密码 }} inserted: false delegate_to: localhost - name: 关闭本地临时HTTP服务 ansible.builtin.shell: kill {{ local_http_pid.ansible_pid }} delegate_to: localhost
Terraform 实现流程
Terraform适合声明式定义基础设施配置,如果后续需要对接服务器资源编排、云原生环境部署可以选择该方案:
- 工作目录下初始化iLO provider:
terraform { required_providers { ilo = { source = "hpe/ilo" version = ">=1.2.0" } } } provider "ilo" { host = var.ilo_ip username = var.ilo_username password = var.ilo_password } - 定义安装相关资源:因为Terraform本身不擅长管理临时长生命周期进程,建议提前将ISO和应答文件放在稳定可达的HTTP文件服务上,也可以通过
local-execprovisioner临时启动本地HTTP服务。# 挂载Ubuntu安装镜像为虚拟光驱 resource "ilo_virtual_media" "ubuntu_iso" { image_url = "http://${var.local_pc_ip}:8080/${var.ubuntu_iso_filename}" media_type = "CD" inserted = true } # 配置单次从虚拟光驱启动 resource "ilo_boot_settings" "boot_from_cd" { boot_order = ["CD", "HDD", "PXE"] boot_source_override_enabled = true boot_source_override_target = "CD" boot_source_override_mode = "UEFI" # 根据服务器实际启动模式调整为Legacy depends_on = [ilo_virtual_media.ubuntu_iso] } # 重启服务器触发安装流程 resource "ilo_power" "server_restart" { power_state = "Reset" depends_on = [ilo_boot_settings.boot_from_cd] } - 执行
terraform apply触发流程,安装完成后可通过null_resource配合连通性检测逻辑,执行虚拟介质卸载、启动顺序还原的收尾操作。
注意事项
- 自动应答文件是自动化成功的核心:Ubuntu 20.04之后废弃了传统preseed机制,必须使用符合subiquity规范的autoinstall配置,配置完成后可以先在虚拟机测试一次,确认无交互步骤再用于物理服务器安装
- iLO版本适配:iLO4及更早的老版本固件不支持直接挂载HTTP地址的虚拟镜像,需要先将ISO上传到iLO内置的虚拟介质存储后再挂载
- 安全注意:临时启动的HTTP服务仅绑定iLO管理网段的IP,不要暴露到公网或业务网段,避免非授权访问
- 排障方式:如果安装流程卡住,可以直接通过iLO内置的HTML5 KVM控制台查看安装界面报错,不需要到机房接物理显示器
内容的提问来源于stack exchange,提问作者Sticky
相关产品推荐
相关产品推荐

