批量安装操作系统是生产中减轻运维人员劳动的一种方法
windows中是微软开发的wds技术(windows 部署服务),详细步骤请参考https://jingyan.baidu.com/article/f0e83a25a844b022e5910196.html
但须注意批量安装时sid对windows AD(活动目录)所造成的影响
centos 采用redhat公司的开源kickstart 技术,功能强大
对比:
kickstart是一个项目的名称
cobbler是对kickstart的所有组件的封装

基本过程(文档参考https://blog.csdn.net/openbox2008/article/details/80089567)
①  PXE 客户端发送UDP广播请求
PXE 客户端从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。
② DHCP服务器提供信息
DHCP服务器收到客户端的请求,验证是否来至合法的PXE 客户端的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
③ PXE客户端请求下载启动文件
客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
④ TETP服务器响应客户端请求并传送文件
当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROM由TFTP通讯协议从tftp服务器 下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
⑤ 请求下载自动应答文件
客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
⑥ 客户端安装操作系统
将ks.cfg文件下载回来后,通过该文件找到http镜像,并按照该文件的配置请求下载安装过程需要的软件包。
http镜像和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。
安装完成后,将提示重新引导计算机。
3.server 脚本,本着“一切从简,适合生产”
#!/usr/bin/env bash
#================================================================
#   
#   systemos=centos7.2
#   #this is automatic install system script
#   Author:xw    thank you!!!
#   Date:2018.5.31
#   Description:install centos7.2
#   wang.cong@aliyun.com
#================================================================
install_deploy_file=/var/log/deploy.log
install_log_file=/var/log/pxe.log
systemctl stop firewalld.service && systemctl disable firewalld.service >> ${install_deploy_file} 2>&1
setenforce 0 && sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config >> ${install_deploy_file} 2>&1
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo >> ${install_deploy_file} 2>&1
yum clean all >> ${install_deploy_file} 2>&1
yum makecache >> ${install_deploy_file} 2>&1
#install soft
yum install -y dhcp syslinux httpd tftp-server >> ${install_deploy_file} 2>&1
if [ $(echo $?) -eq 0 ];then
 echo "soft is success"  >> ${install_log_file} 2>&1
fi
#deploy_dhcp
cat >/etc/dhcp/dhcpd.conf<<EOF
subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.200 192.168.3.220;
option subnet-mask 255.255.255.0;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.3.128;
filename "/pxelinux.0";
 }
EOF
cat >/var/www/html/ks.cfg<<EOF
install
url --url="http://192.168.3.128/CentOS7/"
text  
lang en_US.UTF-8 
keyboard --vckeymap=us --xlayouts='us'
zerombr
network  --bootproto=dhcp --device=eno2359687 --ipv6=auto --activate
timezone --utc Asia/Shanghai
rootpw 147258369
clearpart --all --initlabel
part /boot --fstype ext4 --size 500
part swap --size 2048
part / --fstype ext4 --size 1 --grow 
reboot  
%packages 
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
sysstat
lrzsz
dos2unix
telnet
wget
vim
bash-completion
%end
%post 
systemctl stop firewalld.service 
systemctl disable firewalld.service
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0 
%end
EOF
#install_systemimage
cp /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot/ >> ${install_deploy_file} 2>&1
mkdir -p /var/www/html/CentOS7/ >> ${install_deploy_file} 2>&1
mount /dev/cdrom /var/www/html/CentOS7/ >> ${install_deploy_file} 2>&1
cp -a /var/www/html/CentOS7/isolinux/* /var/lib/tftpboot/ >> ${install_deploy_file} 2>&1 
mkdir -p /var/lib/tftpboot/pxelinux.cfg >> ${install_deploy_file} 2>&1 
cp /var/www/html/CentOS7/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default >> ${install_deploy_file} 2>&1 
chmod o+rwx /var/www/html/ks.cfg >> ${install_deploy_file} 2>&1
#install default
cat >/var/lib/tftpboot/pxelinux.cfg/default<<EOF
default ks
prompt 0
label ks
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.3.128/ks.cfg
EOF
#install_service
systemctl start dhcpd >> ${install_deploy_file} 2>&1
systemctl start httpd.service >> ${install_deploy_file} 2>&1
systemctl start tftp.socket >> ${install_deploy_file} 2>&1
if [ $(echo $?) -eq 0 ];then
 echo "soft_service all status ok"  >> ${install_log_file} 2>&1
fi 
echo -e "\e[1;31m all success please talk your administrator deploy all The server \e[0m"