这个问题源于早几年前印象比较深刻的面试,面的岗位是UCloud
的CDN
运维交付岗,当时面试官问我,在批量PXE
的时候怎么才能快速确认是否已经PXE
成功了?我当时的回答是可以看dhcp服务器
分配的地址数量来确定。我已经忘记了为什么我会说出这样的答案,虽然后面通过了面试,但由于其他的原因没有选择去那边工作。最近在看PXE
相关的东东,想了一个不太成熟的方案,以此来记录一下。
一、我的方案效果
-
PXE
服务管理
-
主机
PXE
效果展示
-
主机
PXE
完成
-
主机
PXE
失败
二、实现原理
实现原理非常简单,只需要PXE
执行前和执行后分别执行curl
命令,将数据post
到PXEServer
即可。以下是我在ks.cfg
中使用的curl脚本
%pre --log=/var/log/kickstart_pre.log
export PXEServer=192.168.137.6
curl -X POST -H "Content-Type: application/json" -d "{\"PASSWORD\": \"PXEServer123\", \"HostUUID\": \"$(dmidecode -s system-uuid)\",\"HostMAC\":\"$(cat /sys/class/net/*/address | grep -v \"^00\" | head -n1)\",\"HostStatus\":\"0\",\"Message\":\"Start Install OS...\"}" http://${PXEServer}/PxeProcess/
%end
%post --log=/var/log/kickstart_post.log
export PXEServer=192.168.137.6
curl -X POST -H "Content-Type: application/json" -d "{\"PASSWORD\": \"PXEServer123\", \"HostUUID\": \"$(dmidecode -s system-uuid)\",\"HostMAC\":\"$(cat /sys/class/net/*/address | grep -v \"^00\" | head -n1)\",\"HostStatus\":\"100\",\"Message\":\"Install OS Complete\"}" http://${PXEServer}/PxeProcess/
%end
这里可以自定义,比如在安装比较复杂的场景,安装完
HostOS
后要需要执行脚本去安装第三方包、修改配置等,可以在脚本上去执行curl
命令,对不同步骤安装成功或失败做定义。
三、使用到的东东
-
后端:python3 + django4 + 原生http.server(用做repo源)
-
前端:jQuery + bootstrap v5 + bootstrap-table (不懂前端,90%的时间都消耗在这)
-
PXE:iPXE(兼容性比PXE强)+ dnsmasq(实现dhcp+tftp)+ ks.cfg + 操作系统ISO
四、如何使用
1、修改settings
配置文件
# DHCP 地址池
DHCPCONFIG = {
'Start_IP':'192.168.137.100',
'End_IP': '192.168.137.200',
'Gateway': '192.168.137.1',
'PxeServerIP':'192.168.137.6',
'DNSServer':'8.8.8.8,114.114.114.114', # 可以填写多个,使用,分割
}
PXESERVERCONFIG = {
'PXEPassword' : 'PXEServer123', # 客户端curl post的时候需要带上密码
'REPOPort': 8002, # 软件源的端口,要和ks.cfg中保持一致
2、安装dnsmasq和django
# Centos or redhat
yum install dnsmasq
# ubuntu or debian
apt-get install dnsmasq
# django
pip3 install django==4.2.1
3、挂载ISO
mount /dev/sr0 pxefile/ISO
4、修改pxefile/ipxe/menu.ipxe
文件
#!ipxe
initrd http://${next-server}:8002/ISO/isolinux/initrd.img
kernel http://${next-server}:8002/ISO/isolinux/vmlinuz \
initrd=initrd.img \
inst.ks=http://${next-server}:8002/KS/ks.cfg \
inst.repo=http://${next-server}:8002/ISO/ \
root=live:http://${next-server}:8002/ISO/LiveOS/squashfs.img \
ro rd.AUTO=1 rd_NO_LUKS LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 \
crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us
boot
8002为REPOPort端口
initrd.img和vmlinuz路径要修改为ISO里面的路径
5、修改ks.cfg
,将其上传到pxefile/KS
目录下中
6、运行项目
python3 manager.py runserver 0:80
PS:本文只是记录个思路,有解但可能不是最优解~
我是运维少年,如果文章对您有帮助,欢迎关注我的同名公众号~