异想天开 | 如何实现PXE可视化?批量主机PXE如何监控状态?

这个问题源于早几年前印象比较深刻的面试,面的岗位是UCloudCDN运维交付岗,当时面试官问我,在批量PXE的时候怎么才能快速确认是否已经PXE成功了?我当时的回答是可以看dhcp服务器分配的地址数量来确定。我已经忘记了为什么我会说出这样的答案,虽然后面通过了面试,但由于其他的原因没有选择去那边工作。最近在看PXE相关的东东,想了一个不太成熟的方案,以此来记录一下。

一、我的方案效果

  • PXE服务管理

图片

  • 主机PXE效果展示

图片

  • 主机PXE完成

图片

图片

  • 主机PXE失败

图片

二、实现原理

实现原理非常简单,只需要PXE执行前和执行后分别执行curl命令,将数据postPXEServer即可。以下是我在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:本文只是记录个思路,有解但可能不是最优解~
我是运维少年,如果文章对您有帮助,欢迎关注我的同名公众号~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值