
在程序部署的过程中我们经常需要批量部署操作系统,本着“能自动化的绝不手动做”的原则,显然重复部署操作系统这种活儿,我们应该交给脚本去完成。这篇文章就跟大家分享一下如何基于PXE、Kickstart以及dnsmasq实现CentOS7自动部署。
什么是PXE
PXE(Pre-boot Execution Environment,预启动执行环境)其实是一种算得上“古老”的技术,Intel和Systemsoft早在1999年对外发布了PXE2.1规范,而PXE背后的概念起源于BOOTP/DHCP/TFTP协议的早期阶段,所以严格来说它的历史可以追溯到1985年之前。这项技术诞生的主要目的就是通过网络进行操作系统的自动化部署。
简单来说,PXE就是用来通过网络进行操作系统的自动化部署的一种技术集合,它依赖于DHCP以及TFTP服务,每一台支持PXE启动的机器都可以看作一台PXE Client(PXE Client的ROM中包含TFTP Client),PXE Client会向其所在网络中的DHCP服务索取IP地址以及PXE文件位置,之后经过TFTP服务器获取并执行pxelinux.0、pxelinux.cfg、vmlinuz、initrd.img等文件,实现系统的下载、引导以及安装。其具体原理可以参考维基百科。

那什么是Kickstart呢
手动安装操作系统的时候,往往有很多选项需要进行配置,我们想要实现自动化,就需要一个工具来代替我们做出选择,我们只需要把这个工具配置好,剩下的都交给它。Kickstart就是这样的一个工具,它是Red Hat Enterprise Linux操作系统自动执行无人值守的操作系统安装和配置的一种常用方法。
Kickstart安装系统时需要有相应的配置文件才能正常工作,这个文件中记录了我们需要安装的操作系统的各种配置、依赖的软件包、安装过程以及安装完成后要执行的脚本等等,它是安装过程的核心文件。我们有很多方式去生成这个配置文件:
- 如果你对Kickstart很熟悉,你可以手动编写或者基于系统中已经存在的kickstart文件进行改写。
- 你可以使用配套的GUI程序
system-config-kickstart傻瓜式生成配置文件。 - 你还可以使用系统安装程序
Anaconda来生成配置文件。
除此之外如果你有兴趣,还可以了解一下Cobbler)这款安装部署软件。
找一张图来说明一下完整过程(实际情况中OS Server、install/boot Server以及DHCP Server可以在一台机器上):
具体步骤
下面简单的记录一下我的安装步骤,为了方便我采用了GUI工具配置kickstart配置文件,具体步骤如下:
安装所需要的服务于平台
[root@localhost file]# yum -y install tftp tftp-server dnsmasq syslinux nfs-* rpc* vim xinetd system-config-kickstart
配置tftp
1 | [root@localhost file]# vim /etc/xinetd.d/tftp |
配置NFS
1 | [root@localhost file]# cat /etc/exports |
配置dnsmasq(支持dhcp/和pxe文件):
1 | [root@localhost file]# egrep -v "^#|^$" /etc/dnsmasq.conf |
配置default
1 | [root@localhost file]# mkdir /var/lib/tftpboot/pxelinux.cfg |
拷贝文件
1 | [root@localhost tftpboot]# cp -rf /mnt/isolinux/{boot.msg,initrd.img,vmlinuz} /var/lib/tftpboot/ |
配置kicksatrt
此步骤采用桌面环境下的Kickstart工具进行辅助配置,实际可根据需求手动修改ks.cfg文件
- 设置基本配置:
配置时区、键盘、密码等信息,勾选安装后重启 - 设置安装方法:

- 设置是否加载引导程序:

- 设置分区信息:

设置网络:
默认即可设置验证信息:
默认即可设置防火墙:
关闭防火墙设置安装软件包: 根据需要选择安装包
NOTE: 当出现错误“由于下载软件包信息失败,软件包选择被禁止”的错误时,需要将/etc/yum.repos.d/CentOS-Base.repo 中的[base]修改为[development],否则
kickstart找不到yum源
- 编写安装后的脚本:
以下脚本用于修改修改主机名和网卡名1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16for lines in $(seq 0 `find /etc/sysconfig/network-scripts/ -name "ifcfg-*"| grep -v "ifcfg-lo"| wc -l`);do
for dev_name in `find /etc/sysconfig/network-scripts/ -name "ifcfg-*" | awk -F '-' '{if($NF !~ /eth/){print }}' | grep -v "ifcfg-lo"`;d
o
dev[$lines]=$dev_name
mv ${dev[$lines]} /etc/sysconfig/network-scripts/ifcfg-eth$lines #修改网卡名
sed -i "s#NAME=.*#NAME=eth$lines#" /etc/sysconfig/network-scripts/ifcfg-eth$lines
sed -i "s#DEVICE=.*#DEVICE=eth$lines#" /etc/sysconfig/network-scripts/ifcfg-eth$lines
done
done
sed -i '/GRUB_CMDLINE_LINUX/ s/quiet/quiet net.ifnames=0 biosdevname=0/g' /etc/sysconfig/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
sed -i 's/quiet/quiet net.ifnames=0 biosdevname=0/g' /boot/grub2/grub.cfg
rm -rf /etc/hostname #修改主机名
echo Node`ip addr show | grep eno | awk -F '[/ ]+' '{print $3}' | grep -v [A-Za-z] | head -1 | awk -F '.' '{print $NF}'` > /etc/ho
stname
reboot
将ks.cfg文件保存在/base/file下1
2
3systemctl start nfs
systemctl start xinetd
dnsmasq --addn-host=/var/dnsmasq.hosts --log-facility /tmp/dnsmasq.log --log-queries
至此结束,启动开启一台新的机器进行测试