吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6513|回复: 25
收起左侧

[其他转载] shell脚本 centos7一键部署pxe服务脚本

  [复制链接]
18251370925 发表于 2020-1-11 10:48
本帖最后由 18251370925 于 2020-1-11 10:52 编辑

一键部署centos7 pxe无人值守自动批量安装系统脚本脚本作用: 在centos7上 一键自动部署pxe服务,支持uefi、legacy启动方式引导自动安装系统

pxe介绍:一个在机房可以批量自动安装操作系统的服务

使用脚本前置条件:
1.确保yum可用,可以yum安装dhcp、tftp、xinetd、vsftpd、syslinux、tcpdump等基本服务
2.将iso镜像挂载到/mnt目录下 mount /dev/sr0 /mnt


脚本效果: 脚本会自动安装服务,以部署服务机器的应答文件为模板,即批量安装系统的服务器分区信息、root密码、时区均和服务端相同
测试案例: vmware centos7.7测试ok
                  华为服务器5288 v3 实战批量安装128台
                  hp服务器(型号忘了) 实战批量安装96台
                   浪潮服务器 实战批量安装47台

[Shell] 纯文本查看 复制代码
#/bin/bash
#############################

echo "##############################################"
echo "##      一键部署pxe脚本 使用注意事项       ###"
echo "##        1:确保本地yum源设置ok           ###"
echo "##        2:将镜像挂载到/mnt目录下        ###"
echo "##        3:所有服务器业务网ip相通        ###"
echo "##        4:会自动使用root目录下的        ###"
echo "##        anaconda-ks.cfg应答文件,        ###"
echo "##        其他服务器会按照本机模板批量安装 ###"
echo "##        5:仅在bc7.6、centos7.7测试过    ###"
echo "##############################################"
echo ''

#############设置dhcp服务端
read  -p '请输入本机业务网IP:'  ip
if [ $(echo $ip |awk -F. '{print NF}') -ne 4 ];then
        echo "输入ip错误,请重新输入"
        exit 0
fi
subnet=${ip%%$(echo $ip |awk -F. '{print $4}')}"0"
range1=${ip%%$(echo $ip |awk -F. '{print $4}')}"10"
range2=${ip%%$(echo $ip |awk -F. '{print $4}')}"254"


######################  设置pxe部署方式: bios启动  usef启动    
<<COMMENT
n=1
cfg='pxelinux.0'
while [ $n -eq 1 ]
do
    read -p "请输入pxe部署启动方式 1.uefi 2.bios 请选择1或者2:" start
    if [ $start -eq 1 ];then
        cfg="bootx64.efi"        
        n=0
    elif [ $start -eq 2 ];then
        cfg='pxelinux.0'
        n=0
    else
        echo  "输入错误" 
    fi
    
done
COMMENT








###########安装pxe需要的基础服务
yum install -y dhcp xinetd tftp-server syslinux vsftpd tcpdump >/dev/null
echo "-----------------检查是否安装完成----------------"
for i in {'dhcp','xinetd','tftp-server','vsftpd','syslinux','tcpdump'}
do
        rpm -q $i>/dev/null
        if [ $? -eq 0 ];then
                echo -e "      $i    \033[32m 安装成功 \033[0m    "
        else
                echo -e "      $i   \033[31m 未安装 \033[0m    "
        fi
done
echo "-------------------全部安装完成-----------------"
echo ''
#echo "-------------------开始设置dhcp服务-------------"
cat>/etc/dhcp/dhcpd.conf<<EOF
log-facility local7;
allow booting;
allow bootp;
option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;
subnet $subnet netmask 255.255.255.0 {
  range $range1 $range2;
  option routers $ip;
  next-server $ip;
  if option architecture-type = 00:07 or
     option architecture-type = 00:09 {
       filename "bootx64.efi";
       } 
  else {
       filename "pxelinux.0";
       }
        
}
EOF
##判断dhcp服务起来没有#############
systemctl restart dhcpd>/dev/null  
systemctl status dhcpd>/dev/null
if [ $? -eq 0 ];then
        echo -e "  dhcp服务    \033[32m 启动成功 \033[0m    "
else
        echo -e "  dhcp服务    \033[31m 启动失败 \033[0m    "
fi

#####设置xinetd服务#################
sed -i 's/^.*disable.*$/disable=no/g'   /etc/xinetd.d/tftp
grep 'disable=no' /etc/xinetd.d/tftp>/dev/null
if [ $? -eq 0 ];then
        echo -e "  xintd服务   \033[32m 设置成功 \033[0m    "
else
        echo -e "  xinetd服务    \033[31m 设置失败 \033[0m    "
fi
systemctl restart xinetd>/dev/null
systemctl status xinetd>/dev/null
if [ $? -eq 0 ];then
        echo -e "xinetd服务    \033[32m 启动成功 \033[0m    "
else
        echo -e "xinetd服务    \033[31m 启动失败 \033[0m    "
fi



###############设置syslinux服务###########
cp /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot
cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot
cp /mnt/isolinux/{vesamenu.c32,boot.msg} /var/lib/tftpboot
cp /mnt/EFI/BOOT/BOOTX64.EFI       /var/lib/tftpboot/bootx64.efi
cp /mnt/EFI/BOOT/grub.cfg               /var/lib/tftpboot/grub.cfg  
cp /mnt/EFI/BOOT/grubx64.efi       /var/lib/tftpboot/grubx64.efi
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

num=$(ls /var/lib/tftpboot |wc -l)
if [ $num -gt 6 ];then
        echo -e "\033[32m 引导文件已成功复制到tftp目录下 \033[0m    "
else
        echo -e "\033[31m 引导文件复制到tftp目录失败 \033[0m    "
fi

systemctl restart tftp>/dev/null
systemctl status  tftp>/dev/null
if [ $? -eq 0 ];then
        echo -e "  tftp服务    \033[32m 启动成功 \033[0m    "
else
        echo -e "  tftp服务    \033[31m 启动失败 \033[0m    "
fi

#######bios启动  修改pxelinux.cfg文件 ################
sed -i '1c default linux' /var/lib/tftpboot/pxelinux.cfg/default
sed -i '2c timeout 5' /var/lib/tftpboot/pxelinux.cfg/default
sed  -i "0,/^.*append.*$/s// append initrd=initrd.img inst.stage2=ftp:\/\/$ip ks=ftp:\/\/$ip\/pub\/ks.cfg quiet  /" /var/lib/tftpboot/pxelinux.cfg/default

grep "$ip" /var/lib/tftpboot/pxelinux.cfg/default>/dev/null
if [ $? -eq 0 ];then
        echo -e "  bios引导文件   \033[32m 设置成功 \033[0m    "
else
        echo -e "  bios引导文件    \033[31m 设置失败 \033[0m    "
fi




#######uefi启动  修改grub.cfg文件
sed  -i 's/default="1"/default="0"/g' /var/lib/tftpboot/grub.cfg
sed  -i 's/timeout=60/timeout=5/g' /var/lib/tftpboot/grub.cfg
sed  -i  "0,/^.*linuxefi.*$/s//   linuxefi  (tftp)\/vmlinuz inst.repo=ftp:\/\/$ip ks=ftp:\/\/$ip\/pub\/ks.cfg  ip=dhcp    /" /var/lib/tftpboot/grub.cfg
sed  -i "0,/^.*initrdefi.*$/s//  initrdefi (tftp)\/initrd.img   /" /var/lib/tftpboot/grub.cfg

grep '(tftp)/initrd.img ' /var/lib/tftpboot/grub.cfg>/dev/null
if [ $? -eq 0 ];then
        echo -e "  uefi引导文件   \033[32m 设置成功 \033[0m    "
else
        echo -e "  uefi引导文件    \033[31m 设置失败 \033[0m    "
fi


############################复制镜像到ftp目录下##############################
ftp_num=$(ls /var/ftp |wc -l)
if [ $ftp_num -gt 4 ];then
        echo -e "\033[32m 镜像文件已成功复制到ftp目录下 \033[0m    "
else
        nohup cp -r /mnt/* /var/ftp/>/dev/null 2>&1 &  
        sleep 3
        while :
        do
                ps -ef |grep 'cp -r' |grep -v 'grep'>/dev/mull
                if [ $? -eq 0 ];then
                        echo -ne '\r'
                        echo -ne '--正                                      \r'
                        #sleep 1
                        echo -ne '----正在                                  \r'
                        sleep 1
                        echo -ne '------正在复                              \r'
                        #sleep 1
                        echo -ne '--------正在复制                          \r'
                        sleep 1
                        echo -ne '----------正在复制镜                      \r'
                        #sleep 1
                        echo -ne '------------正在复制镜像                  \r'
                        sleep 1
                        echo -ne '--------------正在复制镜像到              \r'
                        #sleep 1
                        echo -ne '----------------正在复制镜像到ftp录       \r'
                        sleep 1
                        echo -ne '------------------正在复制镜像到ftp目录   \r'
                        sleep 1
                        echo -ne '                                          \r'
                else 
                        break
                fi        
        done        

        



        ftp_num=$(ls /var/ftp |wc -l)
        if [ $ftp_num -gt 4 ];then
                echo -e "\033[32m 镜像文件已成功复制到ftp目录下 \033[0m    "
        else
                echo -e "\033[31m 镜像文件复制到ftp目录失败 \033[0m    "
        fi
fi

systemctl restart vsftpd>/dev/null
systemctl status  vsftpd>/dev/null
if [ $? -eq 0 ];then
        echo -e "   ftp服务    \033[32m 启动成功 \033[0m    "
else
        echo -e "   ftp服务    \033[31m 启动失败 \033[0m    "
fi



#################################设置应答文件###################

if [ ! -d "/var/ftp/pub" ]; then
  mkdir -p /var/ftp/pub
fi

cp /root/anaconda-ks.cfg /var/ftp/pub/ks.cfg
chmod +r /var/ftp/pub/ks.cfg
sed -i "s/cdrom/url --url=ftp:\/\/$ip/g" /var/ftp/pub/ks.cfg
sed -i "s/# System timezone/reboot/g" /var/ftp/pub/ks.cfg
sed -i "s/--none/--all/g" /var/ftp/pub/ks.cfg
sed -i "s/^graphical.*$/text/g" /var/ftp/pub/ks.cfg

grep 'reboot' /var/ftp/pub/ks.cfg >/dev/null
if [ $? -eq 0 ];then
        echo -e "  应答文件    \033[32m 设置成功 \033[0m    "
else
        echo -e "  应答文件    \033[31m 设置失败 \033[0m    "
fi


####################################检查所有服务是否启动成功#############################
echo "-----------------检查所有服务是否启动----------------"
for i in {'dhcpd','xinetd','tftp','vsftpd'}
do
        systemctl status $i>/dev/null
        if [ $? -eq 0 ];then
                echo -e "      $i    \033[32m 启动成功 \033[0m    "
        else
                echo -e "      $i   \033[31m  启动失败 \033[0m    "
        fi
done
systemctl stop firewalld>/dev/null
setenforce 0
chmod -R  +r  /var
echo -e "      防火墙    \033[32m 关闭成功 \033[0m "    
echo "-------------------pxe服务端部署完成-----------------"

免费评分

参与人数 5吾爱币 +5 热心值 +5 收起 理由
柒呀柒 + 1 + 1 用心讨论,共获提升!
Juster07 + 1 + 1 热心回复!
san4san + 1 + 1 我很赞同!
忘川川 + 1 + 1 用心讨论,共获提升!
iamwangz + 1 + 1 给力 有用

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

richang3 发表于 2021-6-27 13:59
whw0623 发表于 2020-1-11 12:30
能做多系统启动吗?就是PXE启动后可以选择windows就进入windows系统安装,选择ubuntu就进入ubuntu的安装, ...

可以多系统启动,就是在default文件中修改。给你一个模板。
辑default
         default meun.c32
   timeout 300
   prompt 0
   
   label 1
   menu label ^1) install centos7
   menu default
   kernel vmlinuz
   append initrdinitrd.img method=http://192.168.1.1/CentOS7/ ks=https=://192.168.1.1/ks.cfg   /
 楼主| 18251370925 发表于 2021-9-2 15:27
kof8855 发表于 2021-8-27 14:59
问题是服务器这么多硬盘,怎么辨别安装的分区?
如果是新服务器,系统盘还得做raid1、其他盘做直通或raid0 ...

一般默认安装到sda,但是实际测试中确实会有raid1的盘符变成sdb、sde之类的,就需要使用预安装脚本%pre来事先识别要安装的分区
whw0623 发表于 2020-1-11 12:30
能做多系统启动吗?就是PXE启动后可以选择windows就进入windows系统安装,选择ubuntu就进入ubuntu的安装,选择deepin就进入deepin的安装
 楼主| 18251370925 发表于 2020-1-11 13:03
whw0623 发表于 2020-1-11 12:30
能做多系统启动吗?就是PXE启动后可以选择windows就进入windows系统安装,选择ubuntu就进入ubuntu的安装, ...

你的意思是 待安装系统机器可以自主选择自动安装某个系统 ?
whw0623 发表于 2020-1-11 13:19
18251370925 发表于 2020-1-11 13:03
你的意思是 待安装系统机器可以自主选择自动安装某个系统 ?

是的,可否多镜像共享,可选系统
 楼主| 18251370925 发表于 2020-1-11 13:53
18251370925 发表于 2020-1-11 13:03
你的意思是 待安装系统机器可以自主选择自动安装某个系统 ?

应该不行,dhcp服务里只能设置一个引导文件
skyward 发表于 2020-1-11 16:05
ubuntu适用吗,已装yum的情况下
 楼主| 18251370925 发表于 2020-1-11 20:43
skyward 发表于 2020-1-11 16:05
ubuntu适用吗,已装yum的情况下

这个没试过  其实yum只是为了安装dhcp等基础服务的
如梦SSS 发表于 2020-1-12 19:19
里面没有那些定制化的东西吗?比如说我要这台机器装什么,不装什么,最小化还是带脚本,等等
 楼主| 18251370925 发表于 2020-1-13 09:30
如梦SSS 发表于 2020-1-12 19:19
里面没有那些定制化的东西吗?比如说我要这台机器装什么,不装什么,最小化还是带脚本,等等

会利用pxe服务器安装系统应答文件/root/anaconda-ks.cfg 来做模板,也就是说本机当时最小化安装的话,后续批量安装的机器也都是最小化安装
baolei1988 发表于 2020-1-13 09:33
这个是做了一个交互式的pxe启动啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表