CentOS7自动部署(PXE+Kickstart)

AutoDeploy
在程序部署的过程中我们经常需要批量部署操作系统,本着“能自动化的绝不手动做”的原则,显然重复部署操作系统这种活儿,我们应该交给脚本去完成。这篇文章就跟大家分享一下如何基于PXEKickstart以及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安装系统时需要有相应的配置文件才能正常工作,这个文件中记录了我们需要安装的操作系统的各种配置、依赖的软件包、安装过程以及安装完成后要执行的脚本等等,它是安装过程的核心文件。我们有很多方式去生成这个配置文件:

  1. 如果你对Kickstart很熟悉,你可以手动编写或者基于系统中已经存在的kickstart文件进行改写。
  2. 你可以使用配套的GUI程序system-config-kickstart傻瓜式生成配置文件。
  3. 你还可以使用系统安装程序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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost file]# vim /etc/xinetd.d/tftp 
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot #tftp的工作目录
disable = yes #将这一行改为no
per_source = 11
cps = 100 2
flags = IPv4
}

配置NFS

1
2
3
[root@localhost file]# cat /etc/exports
/base/file 192.168.195.0/24(rw,sync,no_root_squash) #ks.cfg文件的存放位置
/base/repo 192.168.195.0/24(rw,sync,no_root_squash) #ISO镜像文件存放位置

配置dnsmasq(支持dhcp/和pxe文件):

1
2
3
4
5
6
7
8
[root@localhost file]# egrep -v "^#|^$" /etc/dnsmasq.conf 
dhcp-range=192.168.195.50,192.168.195.150,12h #设置分配的地址池
dhcp-option=3,192.168.195.1 #设置默认网关
dhcp-boot=pxelinux.0
enable-tftp #支持tftp
tftp-root=/var/lib/tftpboot #设置访问目录
dhcp-authoritative
conf-dir=/etc/dnsmasq.d

配置default

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost file]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@localhost file]# mount /dev/cdrom /mnt/
[root@localhost file]#cp -rf /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[root@localhost file]# cat /var/lib/tftpboot/pxelinux.cfg/default #文件修改如下
default ks
prompt 1
timeout 6
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label text
kernel vmlinuz
append initrd=initrd.img text
label ks
kernel vmlinuz
append ks=nfs:192.168.195.131:/base/file/ks.cfg initrd=initrd.img #NFS地址和路径
label local
localboot 1
label memtest86
kernel memtest
append -

拷贝文件

1
2
3
[root@localhost tftpboot]# cp -rf /mnt/isolinux/{boot.msg,initrd.img,vmlinuz} /var/lib/tftpboot/
[root@localhost tftpboot]# cp -rf /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
[root@localhost tftpboot]# cp –rf /mnt/* /base/repo/

配置kicksatrt

此步骤采用桌面环境下的Kickstart工具进行辅助配置,实际可根据需求手动修改ks.cfg文件

  1. 设置基本配置:
    配置时区、键盘、密码等信息,勾选安装后重启
  2. 设置安装方法:
    设置安装方法
  3. 设置是否加载引导程序:
    引导程序
  4. 设置分区信息:
    设置分区信息
  5. 设置网络:
    默认即可

  6. 设置验证信息:
    默认即可

  7. 设置防火墙:
    关闭防火墙

  8. 设置安装软件包: 根据需要选择安装包

NOTE: 当出现错误“由于下载软件包信息失败,软件包选择被禁止”的错误时,需要将/etc/yum.repos.d/CentOS-Base.repo 中的[base]修改为[development],否则kickstart找不到yum源

  1. 编写安装后的脚本:
    以下脚本用于修改修改主机名和网卡名
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    for 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
3
systemctl  start nfs
systemctl start xinetd
dnsmasq --addn-host=/var/dnsmasq.hosts --log-facility /tmp/dnsmasq.log --log-queries

至此结束,启动开启一台新的机器进行测试

坚持原创技术分享,您的支持将鼓励我继续创作!