本帖最后由 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服务端部署完成-----------------"
|