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

news2025/7/19 16:06:48

在这里插入图片描述

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.cfg
        initrd /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/filename
    The 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
#%end

reboot

安装 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.coloradmin.cn/o/2343949.html

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

相关文章

使用 Node、Express 和 MongoDB 构建一个项目工程

本文将详细介绍如何使用 Node.js Express MongoDB 构建一个完整的 RESTful API 后端项目&#xff0c;涵盖&#xff1a; 项目初始化 Express 服务器搭建 MongoDB 数据库连接 REST API 设计&#xff08;CRUD 操作&#xff09; 错误处理与中间件 源码结构与完整代码 部署建…

【C++11】右值引用和移动语义:万字总结

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲右值引用和移动语义 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C学习笔记 &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C语言入门基础&#xff0c;python入门基…

Python基于Django的全国二手房可视化分析系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

VulnHub-DC-2靶机渗透教程

VulnHub-DC-2靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 直接使用VMware导入打开就行 2.信息收集 2.1 获取靶机ip(arp-scan/nmap) arp-scan -l ​ nmap 192.168.135.0/24 2.2 详细信息扫描(nmap)…

n8n 中文系列教程_10. 解析n8n中的AI节点:从基础使用到高级Agent开发

在自动化工作流中集成AI能力已成为提升效率的关键。n8n通过内置的LangChain节点&#xff0c;让开发者无需复杂代码即可快速接入GPT-4、Claude等大模型&#xff0c;实现文本处理、智能决策等高级功能。本文将深入解析n8n的AI节点体系&#xff0c;从基础的Basic LLM Chain到强大的…

计算机网络 | 应用层(1)--应用层协议原理

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记 关注我&#x1f339;&#xff0c;和我一起学习更多计算机的知识 &#x1f51d;&#x1f51d;&#x1f51d; 目录 1. 应用层协议原理 1.1 …

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态

视频讲解&#xff1a; MuJoCo 关节角速度记录与可视化&#xff0c;监控机械臂运动状态 代码仓库&#xff1a;GitHub - LitchiCheng/mujoco-learning 关节空间的轨迹优化&#xff0c;实际上是对于角速度起到加减速规划的控制&#xff0c;故一般来说具有该效果的速度变化会显得丝…

LVGL模拟器:NXP GUIDER+VSCODE

1. 下载安装包 NXP GUIDER&#xff1a;GUI Guider | NXP 半导体 CMAKE&#xff1a;Download CMake MINGW&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases SDL2&#xff1a;https://github.com/libsdl-org/SDL/releases/tag/release-2.30.8 VSCODE&…

《USB技术应用与开发》第四讲:实现USB鼠标

一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它&#xff0c;因为鼠标作为物理抓包&#xff0c;里面有时候会抓到一些错误&#xff0c;不一定是真正的通讯错误&#xff0c;很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…

一、鸿蒙编译篇

一、下载源码和编译 https://blog.csdn.net/xusiwei1236/article/details/142675221 https://blog.csdn.net/xiaolizibie/article/details/146375750 https://forums.openharmony.cn/forum.php?modviewthread&tid897 repo init -u https://gitee.com/openharmony/mani…

得物业务参数配置中心架构综述

一、背景 现状与痛点 在目前互联网飞速发展的今天&#xff0c;企业对用人的要求越来越高&#xff0c;尤其是后端的开发同学大部分精力都要投入在对复杂需求的处理&#xff0c;以及代码架构&#xff0c;稳定性的工作中&#xff0c;在对比下&#xff0c;简单且重复的CRUD就显得…

【算法】单词搜索、最短距离

单词搜索 这道题主要考察了深度优先遍历(DFS)算法。 我们通过几个简单例子来分析一些细节问题&#xff1a; 1. 要搜索的单词串&#xff1a;abc 搜索的过程中必须按照字母顺序&#xff0c;首先从矩阵中的第一个元素开始搜索&#xff0c;遇到字母a则开始深度优先遍历&#xff0…

Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值

目录 函数简介 函数定义&#xff0c;调用&#xff0c;传入参数&#xff0c;返回值 函数的定义 函数的调用和传入参数 函数的返回值 函数简介 函数简介&#xff1a;函数是组织好&#xff0c;可重复使用&#xff0c;用来实现特定功能&#xff08;特定需求&#xff09;的代码…

基于FFmpeg命令行的实时图像处理与RTSP推流解决方案

前言 在一些项目开发过程中需要将实时处理的图像再实时的将结果展示出来&#xff0c;此时如果再使用一张一张图片显示的方式展示给开发者&#xff0c;那么图像窗口的反复开关将会出现窗口闪烁的问题&#xff0c;实际上无法体现出动态画面的效果。因此&#xff0c;需要使用码流…

【随笔】地理探测器原理与运用

文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用&#xff1a;excel 一、作者与下载 1.1 软件作者 作者&#xff1a; DOI: 10.…

从零开始使用SSH链接目标主机(包括Github添加SSH验证,主机连接远程机SSH验证)

添加ssh密钥(当前机生成和远程机承认) 以下是从头开始生成自定义名称的SSH密钥的完整步骤&#xff08;以GitHub为例&#xff0c;适用于任何SSH服务&#xff09;&#xff1a; 1. 生成自定义名称的SSH密钥对 # 生成密钥对&#xff08;-t 指定算法&#xff0c;-f 指定路径和名称…

Maxscale实现Mysql的读写分离

介绍&#xff1a; Maxscale是mariadb开发的一个MySQL数据中间件&#xff0c;配置简单&#xff0c;能够实现读写分离&#xff0c;并且能根据主从状态实现写库的自动切换&#xff0c;对多个服务器实现负载均衡。 实验环境&#xff1a; 基于gtid的主从同步的基础上进行配置 中…

Spring Boot 启动生命周期详解

Spring Boot 启动生命周期详解 1. 启动阶段划分 Spring Boot 启动过程分为 4个核心阶段&#xff0c;每个阶段涉及不同的核心类和执行逻辑&#xff1a; 阶段 1&#xff1a;预初始化&#xff08;Pre-initialization&#xff09; 目标&#xff1a;准备启动器和环境配置关键类&am…

数据湖DataLake和传统数据仓库Datawarehouse的主要区别是什么?优缺点是什么?

数据湖和传统数据仓库的主要区别 以下是数据湖和传统数据仓库的主要区别&#xff0c;以表格形式展示&#xff1a; 特性数据湖传统数据仓库数据类型支持结构化、半结构化及非结构化数据主要处理结构化数据架构设计扁平化架构&#xff0c;所有数据存储在一个大的“池”中多层架…

解决conda虚拟环境安装包却依旧安装到base环境下

最近跑项目装包装到几度崩溃&#xff0c;包一直没有安装到正确位置&#xff0c;为此写下这篇文章记录一下&#xff0c;也希望能帮到有需要的人。&#xff08;此文章开发环境为anaconda和window&#xff09; 方法一 先conda deactivate,看到&#xff08;base&#xff09;消失…