基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装

在这里插入图片描述

Author:Arsen
Date:2025/04/26


目录

    • 环境要求
    • 实现步骤
      • 自定义 ISO
      • 安装 ipmitool
      • 安装 NFS
      • 定义 ks.cfg
      • 安装 HTTP
      • 编写 Pipeline
    • 功能验证


环境要求

目标服务器支持 IPMI / Redfish 远程管理(如 DELL iDRAC、HPE iLO、华为 iBMC),且服务器支持从虚拟光驱(ISO)启动。

实现步骤

自定义 ISO

挂载 ISO 镜像

mkdir -p /mnt/iso /home/openEuler
mount -o loop /opt/tools/openEuler-22.03-LTS-aarch64-dvd.iso /mnt/iso
cp -a /mnt/iso/* /home/openEuler
cp -a /mnt/iso/.discinfo /home/openEuler
cp -a /mnt/iso/.treeinfo /home/openEuler
umount /mnt/iso

修改 grub.cfg 配置文件

grub.cfg 指定 ks.cfg 配置文件 http 地址(httpd 服务安装看 4.5 部分),使得安装操作系统时自动加载 ks.cfg 配置文件。

vim /home/openEuler/EFI/BOOT/grub.cfg
# 保留menuentry 'Install openEuler 22.03-LTS'即可
# 可以把多余的配置删除:
# 	menuentry 'Test this media & install openEuler 22.03-LTS'
# 	submenu 'Troubleshooting -->'
#
...
menuentry 'Install openEuler 22.03-LTS' --class red --class gnu-linux --class gnu --class os {linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=openEuler-22.03-LTS-aarch64 ro inst.geoloc=0 console=tty0 smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 video=efifb:off video=VGA-1:640x480-32@60me fpi_to_tail=off inst.ks=http://x.x.x.x/ks.cfginitrd /images/pxeboot/initrd.img
}
...

重新打包 ISO 镜像

注意1:需在与 ISO 相同的架构类型(aarch64/x86)服务器上打包。

注意2:grub.cfg 配置文件中 inst.stage2=hd:LABEL= 指定的 ISO 卷标一定要和你制作镜像时 -volid 指定的卷标保持一致,否则将无法安装。

# 注意:xorriso 命令不存在则安装 yum install -y xorriso
cd /home/openEuler
xorriso -as mkisofs \-o /opt/openEuler-22.03-LTS-aarch64-dvd-custom.iso \-iso-level 3 \-full-iso9660-filenames \-volid "openEuler-22.03-LTS-aarch64" \-eltorito-alt-boot \-e images/efiboot.img \-no-emul-boot \-isohybrid-gpt-basdat \-R -J -v -T \.# 或以下命令打包也是可以的,只不过是xorriso是mkisofs的替代品,同时也兼容mkisofs,且速度比 mkisofs 快
cd /home/openEuler
mkisofs -R -J -T -r -l -d -joliet-long \-allow-multidot -allow-leading-dots -no-bak \-V "openEuler-22.03-LTS-aarch64" \-o "/opt/openEuler-22.03-LTS-aarch64-dvd-custom.iso" \-e images/efiboot.img -no-emul-boot "./"
参数说明
-o输出 ISO 路径
-iso-level 3支持长文件名
-full-iso9660-filenames支持完整文件名格式
-volid设置 ISO 卷标(可自定义,需与 grub.cfg 配置文件中 inst.stage2=hd:LABEL= 对应)
-eltorito-alt-boot启用备用启动方式(用于 UEFI)
-e images/efiboot.img指定 UEFI 启动文件
-no-emul-boot指定 UEFI 启动使用 no emulation 模式
-isohybrid-gpt-basdat创建支持 BIOS+UEFI 的混合启动镜像(关键)
-R -J -v -T生成 Rock Ridge / Joliet 扩展,启用详细模式和 TRANS.TBL 文件
.当前目录为打包源(必须是包含 EFI、Packages 等内容的根目录)

安装 ipmitool

安装 ipmitool

该工具支持 IPMI / Redfish 远程管理(如 DELL iDRAC、HPE iLO、华为 iBMC),在 jenkins 服务器上安装,因为我们正是通过 jenkins 实现自动化安装 OS 的。

yum install -y ipmitool

验证(以 iBMC 为例)

# 设置服务器启动顺序为光驱
ipmitool -I lanplus -H <iBMC的IP地址> -U <iBMC的登录用户> -P <iBMC的登录密码> chassis bootdev cdrom# 服务器强制下电再上电
ipmitool -I lanplus -H <iBMC的IP地址> -U <iBMC的登录用户> -P <iBMC的登录密码> power cycle

注意的是,挂载ISO时,华为系列服务器不支持该指令:

ipmitool -I lanplus -H 172.16.10.97 -U Administrator -P Allcam@1024! cd set http://172.16.11.106/CentOS.iso  

华的使用的是 ipmcset/ipmcget 操作 iBMC

# 登录 iBMC 并挂载
sshpass -p '<iBMC的登录密码>' ssh <iBMC的登录用户>@<iBMC的IP地址>
iBMC:/->ipmcset -t vmm -d connect -v "https://x.x.x.x/iso/openEuler-22.03-LTS-aarch64-dvd.iso"# 登录 iBMC 并挂载(非交互式方式)
sshpass -p '<iBMC的登录密码>' ssh -o StrictHostKeyChecking=no <iBMC的登录用户>@<iBMC的IP地址> 'ipmcset -t vmm -d connect -v "https://x.x.x.x/iso/openEuler-22.03-LTS-aarch64-dvd.iso"'

注意:通过 ipmcset 挂载时,如果已经有 iso 占用(连接)虚拟媒体了,执行挂载时会报如下错:

.........
You cannot use the virtual media because it is being used by another user.

解决方案:手动登录iBMC断开与虚拟媒体的连接或通过命令断开后,再执行挂载操作,如下:

iBMC:/->ipmcset -t vmm -d disconnect
iBMC:/->ipmcset -t vmm -d connect -v "https://x.x.x.x/iso/openEuler-22.03-LTS-aarch64-dvd.iso"
Connect virtual media...
...........
Connect virtual media successfully.

因此,我们可将 ipmitool 与 ipmcset/ipmcget 结合使用。

安装 NFS

注意,华为 iBMC 只支持 nfs, cifs, or https 协议挂载 ISO,否则会报如下错,如果你是 Nginx 自签 SSL 证书,那 ipmcset 将认为是无效的,因此我们可以采用 NFS 作为 ISO 镜像源,如果你使用的其他协议共享文件,则忽略该部分。

iBMC:/->ipmcset -t vmm -d connect -v "http://x.x.x.x/iso/openEuler-22.03-LTS-aarch64-dvd-custom.iso
Usage: ipmcset -t vmm -d connect -v <URL>
URL      e.g.: protocol://[username:password@]IP[:port]/directory/filenameThe parameters in the URL are described as follows:The protocol must be nfs, cifs, or https.The URL can contain only letters, digits, and special characters. The directory or file name cannot contain @. The password cannot contain commas (,).Use double quotation marks (") to enclose the URL that contains a space or double quotation marks ("). Escape the double quotation marks (") and back slash (\) contained in the URL.For example, if you want to enter:a b\cd"Enter:"a b\\cd\""

安装 NFS

yum -y install rpcbind
yum -y install nfs-utils

启动 NFS

systemctl start nfs-server
systemctl enable nfs-server
systemctl start rpcbind
systemctl enable rpcbind

编辑共享文件

vim /etc/exports
/data/nginx/html/iso x.x.x.0/24(rw,no_root_squash,sync)# 共享目录:/data/nginx/html/iso
# 共享网络范围:x.x.x.0/24(rw,no_root_squash,sync)

重启 NFS

systemctl restart nfs-server

确认 NFS 是否启动

exportfs -v

使 NFS 配置生效

exportfs -a

NFS 安装完成后,将我们 4.1 部分修改过的 ISO 镜像文件上传到共享目录 /data/nginx/html/iso 下。

定义 ks.cfg

该配置文件其实就是我们操作系统 /root 目录下的 anaconda-ks.cfg 配置文件,不管是手动/自动安装的操作系统,都有该文件,其实我们的操作系统就是按照该配置文件的约定来进行安装的。因此,你可以从你的服务器上拿到你本地优化一下,形成你自己的配置文件,让服务器按照你自定义的 ks.cfg 约定进行操作系统安装。

# Disk partitioning information
%pre
#!/bin/bash
# Obtain all disk names and sizes, and sort them in descending order by size
DISKS=($(lsblk -b -d -n -o NAME,SIZE | sort -k2 -nr | awk '{print "/dev/"$1}'))
# Allocate the first three plates
DATA_DISK=${DISKS[0]}
SYS_DISK=${DISKS[1]}
cat > /tmp/disk_rules.cfg <<EOF
ignoredisk --only-use=${SYS_DISK},${DATA_DISK_MVS},${DATA_DISK_MIO}
clearpart --all --initlabel --drives=${SYS_DISK},${DATA_DISK_MVS},${DATA_DISK_MIO}
# SYS_DISK
part /boot/efi --fstype="efi" --ondisk=${SYS_DISK} --size=256 --fsoptions="umask=0077,shortname=winnt"
part /boot --fstype="ext4" --ondisk=${SYS_DISK} --size=512
part pv.sys --fstype="lvmpv" --ondisk=${SYS_DISK} --size=1 --grow
volgroup sysvg --pesize=4096 pv.sys
logvol / --fstype="ext4" --size=1 --grow --name=root --vgname=sysvg
logvol /home --fstype="ext4" --size=153600 --name=home --vgname=sysvg
# DATA_DISK
part pv.mvs --fstype="lvmpv" --ondisk=${DATA_DISK} --size=1 --grow
volgroup datavgmvs pv.mvs
logvol /data --fstype="ext4" --size=1 --grow --name=milvus --vgname=datavgmvs
EOF
%end
%include /tmp/disk_rules.cfg# Use graphical install
graphical# Use CDROM installation media
cdrom# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'# System language
lang en_US.UTF-8# Network information
network --device=eth0 --bootproto=static --ip=x.x.x.x --netmask=x.x.x.x --gateway=x.x.x.x --nameserver=x.x.x.x --onboot=yes --ipv6=auto --activate --hostname=localhost.localdomain# Root password
rootpw --iscrypted $6$Czg4S0A2ZjCZC8HK$G.Yiio2kX/1ibv7nmcH/XxqxBcK7mc1OLNTZn4R4c2fcIIRQWeQFkbl4aUNEKcSAK4msnm3640QKI4HCu8.r6.# Run the Setup Agent on first boot
firstboot --enable# Do not configure the X Window System
skipx# System services
services --enabled="chronyd"# System timezone
timezone Asia/Shanghai --utc --nontp%packages
@^minimal-environment
@container-management
@development
@headless-management
@legacy-unix
@network-server
@scientific
@security-tools
@smart-card
@standard
@system-tools
%end%anaconda
pwpolicy root --minlen=8 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=8 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=8 --minquality=1 --notstrict --nochanges --notempty
%end%addon com_redhat_kdump --disable --reserve-mb='128'
%end#%post
#%endreboot

安装 HTTP

提供 ks.cfg 文件服务,或使用主流的 Nginx 服务也是没问题的。

yum install httpd -y
systemctl start httpd
systemctl enable httpd# 默认配置文件目录:/etc/httpd/
# 默认网站发布目录:/var/www/html/

安装完成后,将 4.4 部分的 ks.cfg 文件上传至 /var/www/html/ 目录下,这样安装操作系统时会自动拉取该配置文件,因为我们在 4.1 部分 grub.cfg 就内嵌了 ks.cfg 的路径了。

编写 Pipeline

整体思路就是:

# 取消ISO挂载
sshpass -p '<iBMC的登录密码>' ssh -o StrictHostKeyChecking=no <iBMC的登录用户>@<iBMC的IP地址> 'ipmcset -t vmm -d disconnect'# 进行ISO挂载
sshpass -p '<iBMC的登录密码>' ssh -o StrictHostKeyChecking=no <iBMC的登录用户>@<iBMC的IP地址> 'ipmcset -t vmm -d connect -v "nfs://x.x.x.x:/data/nginx/html/iso/openEuler-22.03-LTS-aarch64-dvd-custom.iso"'# 设置服务器启动顺序为光驱
ipmitool -I lanplus -H <iBMC的IP地址> -U <iBMC的登录用户> -P <iBMC的登录密码> chassis bootdev cdrom# 强制服务器下电再上电,进入自动化安装
ipmitool -I lanplus -H <iBMC的IP地址> -U <iBMC的登录用户> -P <iBMC的登录密码> power cycle

Pipeline 流水线脚本就交给你们去编写了,如果你选择看了这篇文章,那就说明你的具备一定的 Pipeline 脚本编写能力。

功能验证

执行 Jenkins 构建

image-20250426183216633

操作系统登录验证

image-20250426183345312

至此,OS 自动化安装就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?

在SpringBoot开发中&#xff0c;我们经常需要从配置文件中读取各种参数。对于简单的字符串或数值&#xff0c;直接使用Value注解就可以了。但当我们需要注入更复杂的数据结构&#xff0c;比如Map或者List时&#xff0c;该怎么操作呢&#xff1f;特别是使用YAML这种更人性化的配…

短信验证码安全实战:三网API+多语言适配开发指南

在短信服务中&#xff0c;创建自定义签名是发送通知、验证信息和其他类型消息的重要步骤。万维易源提供的“三网短信验证码”API为开发者和企业提供了高效、便捷的自定义签名创建服务&#xff0c;可以通过简单的接口调用提交签名给运营商审核。本文将详细介绍如何使用该API&…

RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗

1. GlobalTransactional 和 Transactional 是否冲突&#xff1f; 答&#xff1a;不冲突&#xff0c;它们可以协同工作&#xff0c;但作用域不同。 Transactional: 这是 Spring 提供的注解&#xff0c;用于管理单个数据源内的本地事务。在你当前的 register 方法中&#xff0c…

一台服务器已经有个python3.11版本了,如何手动安装 Python 3.10,两个版本共存

环境&#xff1a; debian12.8 python3.11 python3.10 问题描述&#xff1a; 一台服务器已经有个python3.11版本了&#xff0c;如何手动安装 Python 3.10&#xff0c;两个版本共存 解决方案&#xff1a; 1.下载 Python 3.10 源码&#xff1a; wget https://www.python.or…

c++中的enum变量 和 constexpr说明符

author: hjjdebug date: 2025年 04月 23日 星期三 13:40:21 CST description: c中的enum变量 和 constexpr说明符 文章目录 1.Q:enum 类型变量可以有,--操作吗&#xff1f;1.1补充: c/c中enum的另一个细微差别. 2.Q: constexpr 修饰的函数,要求传入的参数必需是常量吗&#xff…

postman工具

postman工具 进入postman官网 www.postman.com/downloads/ https://www.postman.com/downloads/ https://www.postman.com/postman/published-postman-templates/documentation/ae2ja6x/postman-echo?ctxdocumentation Postman Echo is a service you can use to test your …

Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码

以下是Spring和Spring Boot集成MyBatis的完整对比示例&#xff0c;包含从项目创建到测试的全流程代码&#xff1a; 一、Spring集成MyBatis示例 1. 项目结构 spring-mybatis-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com.example/…

【数据可视化-24】巧克力销售数据的多维度可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

c语言-分支结构

以下是我初学C语言的笔记记录&#xff0c;欢迎留言补充 一&#xff0c;分支结构分为几个 两个&#xff0c;一个是if语句&#xff0c;一个是Switch语句 二&#xff0c;if语句 &#xff08;1&#xff09;结构体 int main() {if()//判断条件{//表达式}else if()//判断条件{//表达式…

数据库MySQL学习——day4(更多查询操作与更新数据)

文章目录 1、聚合函数&#xff08;Aggregate Functions&#xff09;2、分组查询&#xff08;GROUP BY&#xff09;3、更新数据&#xff08;UPDATE&#xff09;4、删除数据&#xff08;DELETE&#xff09;5、进阶练习示例6、 今日小结 1、聚合函数&#xff08;Aggregate Functio…

Spark-SQL 项目

一、项目概述 &#xff08;一&#xff09;实验目标 统计有效数据条数&#xff1a;筛选出uid、phone、addr三个字段均无空值的记录并计数。提取用户数量最多的前 20 个地址&#xff1a;按地址分组统计用户数&#xff0c;按降序排序后取前 20 名。 &#xff08;二&#xff09;…

Redis的ZSet对象底层原理——跳表

我们来聊聊「跳表&#xff08;Skip List&#xff09;」&#xff0c;这是一个既经典又优雅的数据结构&#xff0c;尤其在 Redis 中非常重要&#xff0c;比如 ZSet&#xff08;有序集合&#xff09;底层就用到了跳表。 &#x1f31f; 跳表&#xff08;Skip List&#xff09;简介 …

2025深圳中兴通讯安卓开发社招面经

2月27号 中兴通讯一面 30多分钟 自我介绍 聊项目 我的优缺点&#xff0c;跟同事相比&#xff0c;有什么突出的地方 Handler机制&#xff0c;如何判断是哪个消息比较耗时 设计模式&#xff1a;模板模式 线程的状态 线程的开启方式 线程池原理 活动的启动模式 Service和Activity…

【Castle-X机器人】二、智能导览模块安装与调试

持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】智能导览模块安装与调试 二、智能导览模块安装与调试2.1 智能导览模块安装2.2 智能导览模块调试2.2.1 红外测温传感器测试2.2.2 2D摄像头测试 二、智能导览模块安装与调试 2.1 智能导览模块安装 使用相应工具将智能…

深入理解二叉树遍历:递归与栈的双重视角

二叉树的遍历前序遍历中序遍历后续遍历总结 二叉树的遍历 虽然用递归的方法遍历二叉树实现起来更简单&#xff0c;但是要想深入理解二叉树的遍历&#xff0c;我们还必须要掌握用栈遍历二叉树&#xff0c;递归其实就是利用了系统栈去遍历。特此记录一下如何用双重视角去看待二叉…

Qt Creator中自定义应用程序的可执行文件图标

要在Qt Creator中为你的应用程序设置自定义可执行文件图标&#xff0c;你需要按照以下步骤操作&#xff1a; Windows平台设置方法 准备图标文件&#xff1a; 创建一个.ico格式的图标文件&#xff08;推荐使用256x256像素&#xff0c;包含多种尺寸&#xff09; 可以使用在线工…

Windows11系统中GIT下载

Windows11系统中GIT下载 0、GIT背景介绍0.0 GIT概述0.1 GIT诞生背景0.2 Linus Torvalds 的设计目标0.3 Git 的诞生&#xff08;2005 年&#xff09;0.4 Git 的后续发展0.5 为什么 Git 能成功&#xff1f; 1、资源下载地址1.1 官网资源1.2 站内资源 2、安装指导3、验证是否下载完…

react的fiber 用法

在 React 里&#xff0c;Fiber 是 React 16.x 及后续版本采用的协调算法&#xff0c;它把渲染工作分割成多个小任务&#xff0c;让 React 可以在渲染过程中暂停、恢复和复用任务&#xff0c;以此提升渲染性能与响应能力。在实际开发中&#xff0c;你无需直接操作 Fiber 节点&am…

FPGA前瞻篇-数字电路基础-逻辑门电路设计

模拟信号&#xff1a; 一条随时间连续变化、平滑波动的曲线&#xff0c;比如正弦波。 数字信号&#xff1a; 一条只有高低两个状态&#xff08;0和1&#xff09;&#xff0c;跳变清晰的方波曲线。 在 IC 或 FPGA 的逻辑设计中&#xff0c;我们通常只能处理数字信号&#xff0…

RabbitMQ 基础概念(队列、交换机、路由键、绑定键、信道、连接、虚拟主机、多租户)介绍

本文是博主在梳理 RabbitMQ 知识的过程中&#xff0c;将所遇到和可能会遇到的基础知识记录下来&#xff0c;用作梳理 RabbitMQ 的整体架构和功能的线索文章&#xff0c;通过查找对应的知识能够快速的了解对应的知识而解决相应的问题。 文章目录 一、RabbitMQ 是什么&#xff1f…