Installer
不进bios和阵列卡,不用外部工具也不用买出厂服务,只需要开机,物理服务器便批量自动做硬raid和安装系统以及设置各自的所有网络信息和设置
Install / Use
/learn @zhangguanzhang/InstallerREADME
项目由来
设想一下: 你公司某个节点要建设,进货了200台服务器(不同规格),都是安装同样的系统,区别在于hostname和业务相关的IP以及IPMI(带外的)网络信息。接好所有的线后机柜和网络规划为
+----------------+
| Corenet-Spine |
| |
+-------+--------+
^
|
+---------------------+-------------------------------------------+---------------------+
| ^ | ^ |
| | | | |
| | | | |
+--------+-------+ +--------+-------+ +-------+--------+ +--------+-------+ +--------+-------+
| M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC |
| | | | | | | | | |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------- ------------------ ------------------ ------------------ -----------------+
每个机柜都有各个网络接入的交换机,考虑到最坏最省钱的情况,由于每台服务器都没有做raid(出场做raid得加服务费)。你得到现场去用笔记本一台台直连服务器的带外口网线设置好带外(IPMI)的ip后(出场配置好指定ip或者配置成DHCP得加服务费),才能在办公室通过带外远程继续操作。重启服务器进bios或者阵列卡里去配置阵列(raid)(服务器厂商没有cli tool来远程配置raid),最后在pxe安装完后所有系统后人为一台台上去改hostname和相关的网络设置。 但是如果所有服务器只需要开机通电,就能达到最终需求呢
目前做到的
上架布好线后,统计服务器的序列号和标签名,整理成一份excel表格(现场的人员统计前两列,后面可以让办公室的人填写),例如
| 设备名 | 序列号 | hostname | IPMI IP | MASK | GW | MG IP | MASK | GW | :--- | --- | --- | --- | --- | --- | --- | --- | --- | |HN1-xxx-R4900G3-001 | 210200A00QH19700xxx1 | HN1-XX-ComCVK-001 | 10.101.0.101 | 255.255.255.0 | 10.101.0.254 | 10.102.0.1 | 255.255.255.0 | 10.102.0.254 | |HN1-xxx-R4900G3-002 | 210200A00QH19700xxx2 | HN1-XX-ComCVK-002 | 10.101.0.102 | 255.255.255.0 | 10.101.0.254 | 10.102.0.2 | 255.255.255.0 | 10.102.0.254 | |HN1-xxx-R4900G3-003 | 210200A00QH19700xxx3 | HN1-XX-ComCVK-003 | 10.101.0.103 | 255.255.255.0 | 10.101.0.254 | 10.102.0.3 | 255.255.255.0 | 10.102.0.254 | |HN1-xxx-R4900G3-004 | 210200A00QH19700xxx4 | HN1-XX-ComCVK-004 | 10.101.0.104 | 255.255.255.0 | 10.101.0.254 | 10.102.0.4 | 255.255.255.0 | 10.102.0.254 |
然后(通过curl命令或者后期开发个前端页面)上传excel到后端,autoInstaller相关进程启动后,交换机配置好pxe需要的DHCP的boot-filename,服务器开机后最终就会按照表格里的设置好,全程不需要人为干预
技术前提需知
前提
总结
- 修改grub.cfg适应pxe场景以及ks依赖的俩boot option
- 修改iso的
squashfs.img增加阵列卡的cli tool命令,这步不一定,也可以kickstart的%pre阶段下载cli的包安装然后做阵列 - 编写后端,支持上传excel和根据来源序列号返回渲染是ks文件
实际部署步骤
因为pxe和请求ks的时候都用到了dhcp,所以定义了一个段10.1.0.0/16供安装阶段使用。最终的实际ip和安装段不重合,也就是下面的组网,核心上设置路由都能通,我自己笔记本接核心上设置静态ip:
10.1.0.2 +----------------+
+---+ | Corenet-Spine |
|pc +------>+ |
+---+ +-------+--------+
^
|
+---------------------+-------------------------------------------+---------------------+
| ^ | ^ |
| | | | |
| | | | |
+--------+-------+ +--------+-------+ +-------+--------+ +--------+-------+ +--------+-------+
| M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC | | M/C/S-ACC |
| | | | | | | | | |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------+ +----------------+ +----------------+ +----------------+ +----------------+
| Machine | | Machine | | Machine | | Machine | | Machine |
+----------------- ------------------ ------------------ ------------------ -----------------+
10.1.1.0/24 10.1.2.0/24 10.1.3.0/24 10.1.4.0/24 10.1.5.0/24
一个机柜是一个最小单位,所以一个机柜一个段
实操部署步骤:
准备docker环境
准备一台centos7.6+系统,有条件单独机器也行,我是笔记本虚机桥接网口,笔记本网口接核心上
编译Installer
准备go
安装go,建议1.13以上版本,从官网获取下载直链,当然懂容器的话可以容器编译,这里是在Linux上非容器编译
VERSION=1.14.2
OS=linux
ARCH=amd64
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz #下载多半需要梯子
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
# 配置环境变量
cat <<'EOF'>> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,https://goproxy.io,direct
export CGO_ENABLED=0
EOF
. ~/.bashrc
执行go version有输出则往下走
编译
git clone https://github.com/zhangguanzhang/Installer.git #下载文件
我们这标准都是八张网卡,所以代码里也是八张的逻辑,为了避免少于8张网卡会触发我代码的panic。所以我代码目前是只留一个网卡的逻辑,自行按照自己实际去取消代码api/v1/ks.go里的41-54行的注释,我代码里录入mac地址是为了以后的cmdb,所以mac这部分录入不是那么重要。例如你两批机器分别是6张和8张网卡,你可以留到nic6的部分就行了。
cd Installer
go build -o docker/Installer main.go # 编译可执行文件到docker目录下
准备相关文件
准备镜像相关文件
准备目录,先进入docker目录
cd docker
mkdir -p http/centos tftp mysql http/soft
启动mysql,tftp,nginx
docker-compose up -d
准备pxe启动文件,系统先把安装的iso挂载了
cp -a复制centos iso的EFI/BOOT/下文件到上面的tftp/目录- 把iso解压到
http/centos/目录下,复制iso里/images/pxeboot/的vmlinuz、initrd.img到tftp目录里 - 如果你不想改iso的话可以在
http/soft/下放入安装过程中下载和安装运行做硬raid的命令的安装包啥的 - 更改grub.cfg(tftp里的
grub.cfg.tmpl文件可参考),里面的ip和你实际的pc部署ip要一致,因为安装阶段下载文件是nginx提供的,http/centos/是放centos iso解开的文件,8080是installer,所以是
inst.repo=http://10.1.0.2/centos ks=http://10.1.0.2:8080/api/v1/ks
不要加参数ksdevice=xxx指定ks请求指定网卡,除非你明确现场连线正确,centos7是会去尝试每张网卡的
kickstart部分
kickstart部分自己按照自己的实际写,分区,密码(ks的密码可以用cd scripts里运行python2.7 grub-crypt.py --sha-512生成)啥的。可以参考文档 https://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn
特别是ipmi(也就是bmc)的网络和阵列要自己去测试下,如果阵列的cli没做到iso里这里可以wget cli的包安装然后做阵列,例如把阵列的cli放http/soft下,然后%pre阶段从nginx下载安装
%pre
wget http://10.1.0.2/soft/xxx
chmod u+x xxx
xxx 创建阵列
...
...
%end
ks-mini.tmpl文件是大概的列出了下模板的变量和基础设置,两个文件都参考下
编辑kickstart文件记得dos2unix它,可能windows下编辑有回车
启动Installer
./Installer -ks=template/ks.tmpl # 指定你自己的ks文件
然后再打开个终端进入docker目录往下继续,Installer提供的http接口看文件docs/api.md文件
上传excel文件导入数据库
准备填写好excel文件后,scripts目录里有脚本,参照machines.xlsx的列要求写好这个excel(列的作用是在代码里的常量固定的),然后用脚本upload.sh去curl模拟http上传excel到我后端(url的path为localhost:8080/api/v1/ks POST请求),后端会把excel信息导入到mysql里,例如上传excel文
Related Skills
node-connect
346.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
