PythonScript_demo--搭建PXE服务器

本文涉及的产品
云防火墙,500元 1000GB
简介: 前言是一个测试向的Demo,在实验环境中改改还是可以用的,有助理解PXE服务器的原理。可以结合PXE服务器原理细节来看,传送门:点这里软件环境系统 RHEL7软件 Python 27RHEL7 ISO文件CodePXE Server所需要的所有服务的配置文件都是以重定向输出的方式来写入。

前言

是一个测试向的Demo,在实验环境中改改还是可以用的,有助理解PXE服务器的原理。可以结合PXE服务器原理细节来看,传送门:点这里

软件环境

  • 系统
    • RHEL7
  • 软件
    • Python 27
    • RHEL7 ISO文件

Code

PXE Server所需要的所有服务的配置文件都是以重定向输出的方式来写入。建议在干净的系统中测试。 : )

#!/usr/local/bin/python
#coding=utf8
import commands
import os

def set_network(ipaddr,gateway,dns):
    "网络设置!"
    IPADDR = ipaddr
    GATEWAY = gateway
    DNS = dns
    if len(IPADDR) != 0 and len(GATEWAY) != 0 and len(DNS) != 0:
        checkIP1=commands.getstatusoutput('nmcli connection modify eno16777736 ipv4.addresses "%s %s" ipv4.dns "%s" ipv4.method manual connection.autoconnect yes' % (IPADDR,GATEWAY,DNS))
        checkIP2=commands.getstatusoutput('nmcli connection down eno16777736')
        checkIP3=commands.getstatusoutput('nmcli connection up eno16777736')
        if checkIP1[0] == 0 and checkIP2[0] == 0 and checkIP3[0]== 0:
            print '成功设定IP为%s:' % IPADDR
            print '正在关闭防火墙...'
            return 0
        else:return 1
def set_firewall():
    "防火墙设置!"
    commands.getstatusoutput('systemctl mask ebtables.service')
    commands.getstatusoutput('systemctl mask iptables.service')
    commands.getstatusoutput('systemctl stop firewalld.service')
    return 0
def set_yum(yumDir):
    "yum源配置!"
    MKDIR = yumDir
    checkMkdir=commands.getstatusoutput('mkdir -p %s' % MKDIR)
    checkMount=commands.getstatusoutput('mount /dev/cdrom %s' % MKDIR)
    if checkMkdir[0] == 0 and checkMount[0] == 0:
    checkYum1 = commands.getstatusoutput('printf \'[local-video]\nname=local-video\nbaseurl=file://%s\nenabled=1\ngpgcheck=0\n\' > /etc/yum.repos.d/local.repo' % MKDIR)
    checkYum2 = commands.getstatusoutput('yum list')
    if checkYum1[0] == 0 and checkYum2[0] ==0:
        return 0

def set_dhcp(subNet,subMask,subAddrMix,subAddrMax,gateway,ipaddr):
    SUBMASK = subMask
    SUBADDRMIX = subAddrMix
    SUBADDRMAX = subAddrMax
    SUBROUTERS = subRouters
    GATEWAY = gateway
    IPADDR = ipaddr
    inDhcp=commands.getstatusoutput('yum install -y dhcp')
    if inDhcp[0] == 0:print '安装DHCP成功!'
    checkDhcp=commands.getstatusoutput('printf \'default-lease-time 600;\nmax-lease-time 7200;\nlog-facility local7;\nsubnet %s netmask %s {\n range %s %s;\n option routers %s;\n option broadcast-address 192.168.8.255;\n default-lease-time 601;\n max-lease-time 7201;\n next-server %s;\n filename "/pxelinux.0";\n}\n\' > /etc/dhcp/dhcpd.conf' % (SUBNET,SUBMASK,SUBADDRMIX,SUBADDRMAX,GATEWAY,IPADDR)) 
    commands.getstatusoutput('systemctl restart dhcpd.service')
    commands.getstatusoutput('systemctl enable dhcpd.service')
    checkDhcp=commands.getstatusoutput('netstat -lpunt | grep :67')
    if checkDhcp[0] == 0:return 0
    else:return 1

def set_tftp():
    "配置tftp"
    inTftp=commands.getstatusoutput('yum install -y tftp-server')
    if inTftp[0] == 0:print 'tftp install Successful!'
    inSyslinux=commands.getstatusoutput('yum install -y syslinux')
    if inSyslinux[0] == 0:print 'syslinux install Successful!'
    os.system('cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot')
    os.system('cp %s/isolinux/vmlinuz %s/isolinux/initrd.img %s/isolinux/boot.msg /var/lib/tftpboot' % (MKDIR,MKDIR,MKDIR))
    os.system('mkdir /var/lib/tftpboot/pxelinux.cfg')
    checkTftp=commands.getstatusoutput('printf "default linux\ntimeout 600\ndisplay boot.msg\nmenu clear\nmenu background splash.png\nmenu title Red Hat Enterprise Linux 7.0\nmenu vshift 8\nmenu rows 18\nmenu margin 8\nmenu helpmsgrow 15\nmenu tabmsgrow 13\nmenu color border *\nmenu color sel 0\nmenu color title 0\nmenu color tabmsg 0\nmenu color unsel 0\nmenu color hotsel 0\nmenu color hotkey 0\nmenu color help 0\nmenu color scrollbar 0\nmenu color timeout 0\nmenu color timeout_msg 0\nmenu color cmdmark 0\nmenu color cmdline 0\nmenu tabmsg Press Tab for full configuration options on menu items.\nmenu separator\nmenu separator\nlabel linux\n  menu label ^Install Red Hat Enterprise Linux 7.0\n  kernel vmlinuz\n  append initrd=initrd.img inst.stage2=http://%s/cdrom ks=http://%s/jmilk.cfg quiet\nlabel check\n  menu label Test this ^media & install Red Hat Enterprise Linux 7.0\n  menu default\n  kernel vmlinuz\n  append initrd=initrd.img inst.stage2=hd:LABEL=RHEL-7.0\x20Server.x86_64 rd.live.check quiet\nmenu separator\nmenu begin ^Troubleshooting\n  menu title Troubleshooting\nlabel vesa\n  menu indent count 5\n  menu label Install Red Hat Enterprise Linux 7.0 in ^basic graphics mode\n  text help\n  Try this option out if you\'re having trouble installing\n       Red Hat Enterprise Linux 7.0.\n  endtext\n  kernel vmlinuz\n  append initrd=initrd.img inst.stage2=hd:LABEL=RHEL-7.0\x20Server.x86_64 xdriver=vesa nomodeset quiet\nlabel rescue\n  menu indent count 5\n  menu label ^Rescue a Red Hat Enterprise Linux system\n  text help\n  If the system will not boot, this lets you access files\n       and edit config files to try to get it booting again.\n  endtext\n  kernel vmlinuz\n  append initrd=initrd.img inst.stage2=hd:LABEL=RHEL-7.0\x20Server.x86_64 rescue quiet\nlabel memtest\n  menu label Run a ^memory test\n  text help\n       If your system is having issues, a problem with your\n  system\'s memory may be the cause. Use this utility to\n see if the memory is working correctly.\n  endtext\n  kernel memtest\nmenu separator\nlabel local\n  menu label Boot from ^local drive\n  localboot 0xffff\nmenu separator\nmenu separator\nlabel returntomain\n  menu label Return to ^main menu\n  menu exit\nmenu end\n" > /var/lib/tftpboot/pxelinux.cfg/default' % (GATEWAY,GATEWAY))
    checkTftp=commands.getstatusoutput('printf "service tftp\n{\n       socket_type             = dgram\n       protocol                = udp\n wait                    = yes\n user                    = root\n        server                  = /usr/sbin/in.tftpd\n  server_args             = -s /var/lib/tftpboot\n        disable                 = no\n  per_source              = 11\n  cps                     = 100 2\n       flags                   = IPv4\n}\n" > /etc/xinetd.d/tftp')
    os.system('systemctl restart xinetd.service')
    checkTftpPort=commands.getstatusoutput('netstat -lputn | grep :69')
    if checkTftpPort[0] == 0:return 0
    else:return 1

def set_http():
    os.system('mkdir /var/www/html/cdrom')
    checkMountHtml=commands.getstatusoutput('mount /dev/cdrom /var/www/html/cdrom')
    commands.getstatusoutput('systemctl restart httpd.service')
    commands.getstatusoutput('systemctl enable httpd.service')
    checkHttp=commands.getstatusoutput('netstat -lputn | grep :80')
    if checkHttp[0] == 0:
        return 0
    else:
        return 1

def set_kickstart():
    kickString='install\nkeyboard \'us\'lnreboot\nrootpw --iscrypted $1$xzjcWSZ/$TKDTy17oHtL9o2PW2X13c/\ntimezone Asia/Shanghai\nurl --url="http://'+GATEWAY+'/cdrom"\nlang zh_CN\nfirewall --disabled\nnetwork  --bootproto=dhcp --device=eth0\nauth  --useshadow  --passalgo=sha512\ngraphical\nfirstboot --disable\nselinux --disabled\nbootloader --location=mbr\nzerombr\nclearpart --all --initlabel\npart /boot --fstype="xfs" --size=200\npart / --fstype="xfs" --size=51200\npart /var --fstype="xfs" --size=10240\npart swap --fstype="swap" --size=4096\npart /tmp --fstype="xfs" --size=10240\n%post\nuseradd -u 9999 jmilk\n%end\n%packages\n@backup-server\n@base\n@compat-libraries\n@core\n@desktop-debugging\n@development\n@dial-up\n@directory-server\n@dns-server\n@file-server\n@fonts\n@ftp-server\n@gnome-desktop\n@guest-agents\n@guest-desktop-agents\n@hardware-monitoring\n@identity-management-server\n@infiniband\n@input-methods\n@internet-browser\n@java-platform\n@kde-desktop\n@large-systems\n@load-balancer\n@mail-server\n@mainframe-access\n@mariadb\n@multimedia\n@network-file-system-client\n@performance\n@postgresql\n@print-client\n@print-server\n@remote-desktop-clients\n@remote-system-management\n@smart-card\n@virtualization-client\n@virtualization-hypervisor\n@virtualization-tools\n@x11\n%end\n'
    os.system('touch /var/www/html/jmilk.cfg')
    kickFile=open('/var/www/html/jmilk.cfg','w+')
    kickFile.writelines(kickString)
    kickFile.flush()
    return 0
if __name__ == '__main__':
    "开始搭建PXE Server"

    print '网络设置...'
    while True:
        ipaddr=raw_input('\033[36;1m请输入你要设定的IP/MASK:\033[0m')     #为Output配色
        gateway=raw_input('\033[36;1m请输入你要设定的网关:\033[0m')
        dns=raw_input('\033[36;1m请输入你要设定的DNS:\033[0m')
        if len(IPADDR) != 0 and len(GATEWAY) != 0 and len(DNS) != 0:
            check_network = set_network(ipaddr,gateway,dns)
            if check_network == 0:break
        else:
            print '\033[31;1m请重新输入正确网络配置...\033[0m'

    print '关闭防火墙...'
    while True:
        check_firewall = set_firewall()
        if check_firewall == 0:
            print '防火墙关闭OK!'
            break
        else:
            print '防火墙关闭失败...尝试重新关闭...'

    print '配置yum源...'
    while True:
        yumDir=raw_input('请输入你要挂载光盘的目录(绝对路径):')
        lengthDir=len(yumDir)
        if lengthDir != 0:
            check_yum = set_yum(yumDir)
                if check_yum == 0:
                    print 'yum源配置成功!'
                    break
                else:
                    print 'yum源配置失败,重新输入目录!'
        else:
            print '挂载目录不能为空,重新输入目录!'

    print '搭建DHCP...'
    while True:
        ipaddr=raw_input('请输入你的IP地址:')
        subNet=raw_input('请输入要配置的DHCP子网(subnet):')
        subMask=raw_input('请输入要配置的DHCP子网掩码:')
        subAddrMix=raw_input('请输入地址池的最小ip:')
        subAddrMax=raw_input('请输入地址池的最大ip:')
        subRouters=raw_input('请输入网关IP:')
        if subNet != '' and subMask != '' and subAddrMix != '' and subAddrMax != '' and subRuters != '':
        check_dhcp = set_dhcp(subNet,subMask,subAddrMix,subAddrMax,gateway,ipaddr)
        if check_dhcp == 0:
            print 'DHCP running!'
            break
        else:
            print 'DHCP 启动失败,请重新输入...'

    print '搭建tftp...'
    while True:
        check_tftp = set_tftp()
        if check_tftp == 0:
            print 'tftp running!'
            break
        else:
            print 'tftp 启动失败...尝试重新启动...'

    print '搭建http...'
    while True:
        check_http = set_http()
        if check_http == 0:
            print 'httpd running!'
            break
        else:
            print 'httpd 启动失败...尝试重新启动...'

    print '正在生成无人值守文件...'
        check_kickstart = set_kickstart()
        if check_kickstart == 0:
            print 'PXE配置完毕!请打开虚拟机测试...'
相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
491 201
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
623 157
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
626 46