当前位置: 首页 > news >正文

异想天开 | 如何实现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:本文只是记录个思路,有解但可能不是最优解~
我是运维少年,如果文章对您有帮助,欢迎关注我的同名公众号~

相关文章:

  • HTML中使用JavaScript实现一个简单的鼠标悬停特效。
  • 【概率统计】如何理解概率密度函数及核密度估计
  • 企业微信HOOK开发接口调用,发送语音消息
  • 《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-04-计算机网络
  • 免费百度SEO优化工具,百度SEO优化排名工具
  • Linux篇:进程间通信
  • 数据结构与程序的关系
  • 1、命名空间、C++的复合类型、缺省参数
  • 第四章 SpringCloud Alibaba 实现Ribbon负载均衡
  • C#基础与进阶扩展合集-进阶篇(持续更新)
  • docker搭建nginx实现负载均衡
  • 学生成绩管理系统(Java)
  • [node] Node.js的Web 模块
  • 浅话人工智能和深度学习
  • 好用免费的AI换脸5个工具
  • 【Python3】【力扣题】383. 赎金信
  • 聊一聊大模型 | 京东云技术团队
  • 深度学习-学习笔记记录
  • kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录
  • Windows核心编程 HOOK
  • 陈宝良 高寿仙 彭勇︱明清社会的皇权、商帮与市井百态
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 现场|万米云端,遇见上博
  • 万里云端遇见上博--搭乘“上博号”主题飞机体验记
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元