寒心烟雨情 发表于 2020-1-11 11:55

shell脚本 centos7一键部署pxe服务脚本

一键部署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台#/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 statustftp>/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.cfgip=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 statusvsftpd>/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服务端部署完成-----------------"

18331001812 发表于 2020-1-11 11:57

好的,非常感谢

源木其棋 发表于 2020-1-11 12:07

感谢楼主分享

czv2513655 发表于 2020-1-11 12:07

谢谢大佬

tongai_c 发表于 2020-1-11 12:08

6666

18730922561 发表于 2020-1-11 12:44

谢谢大牛

zhangbinbin 发表于 2020-1-11 18:27

6666666666
页: [1]
查看完整版本: shell脚本 centos7一键部署pxe服务脚本