s15.运维自动化之系统部署 -- 实战案例:实现PXE自动化安装 CentOS 6,7,8

426 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

1.在 CentOS 8 上实现PXE自动化安装 CentOS 6,7,8

1.1 安装前准备

关闭防火墙和SELINUX,DHCP服务器静态IP

网络要求:关闭Vmware软件中的DHCP服务,基于NAT模式

注意:使用 1G 以下内存的主机安装CentOS 7,8 会提示空间不足,建议2G以上

1.2 安装相关软件包并启动

[root@rocky8 ~]# dnf -y install dhcp-server tftp-server httpd syslinux-nonlinux
​
[root@rocky8 ~]# systemctl enable --now httpd tftp dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
Job for dhcpd.service failed because the control process exited with error code. #dhcp服务不能启动,因为没有设置dhcp配置文件
See "systemctl status dhcpd.service" and "journalctl -xe" for details.

1.3 配置DHCP服务

[root@rocky8 ~]# cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf 
cp: overwrite '/etc/dhcp/dhcpd.conf'? y
​
[root@rocky8 ~]# vim /etc/dhcp/dhcpd.conf
option domain-name "example.org";   #设置域名,这里可以不设置 
option domain-name-servers 180.76.76.76, 223.6.6.6; #设置DNS
​
default-lease-time 86400;   #设置DHCP租期                                
max-lease-time 100000; #设置最大DHCP租期log-facility local7;
​
subnet 172.31.0.0 netmask 255.255.248.0 {   #DHCP获取网络段
  range 172.31.7.1 172.31.7.254;    #DHCP获取地址范围
  option routers 172.31.0.2;    #网关
  next-server 172.31.1.8;   #tftp 服务地址
  filename "pxelinux.0";    #pxe获取文件名                                 
}
​
[root@rocky8 ~]# systemctl start dhcpd

1.4 准备yum 源和相关目录

[root@rocky8 ~]# mkdir -pv /var/www/html/centos/{6,7}/os/x86_64
mkdir: created directory '/var/www/html/centos'
mkdir: created directory '/var/www/html/centos/6'
mkdir: created directory '/var/www/html/centos/6/os'
mkdir: created directory '/var/www/html/centos/6/os/x86_64'
mkdir: created directory '/var/www/html/centos/7'
mkdir: created directory '/var/www/html/centos/7/os'
mkdir: created directory '/var/www/html/centos/7/os/x86_64'
[root@rocky8 ~]# mkdir -pv /var/www/html/rocky/8/os/x86_64
mkdir: created directory '/var/www/html/rocky'
mkdir: created directory '/var/www/html/rocky/8'
mkdir: created directory '/var/www/html/rocky/8/os'
mkdir: created directory '/var/www/html/rocky/8/os/x86_64'
​
[root@rocky8 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1  3.7G  0 rom  
sr1          11:1    1  9.5G  0 rom  
sr2          11:2    1   10G  0 rom  
nvme0n1     259:0    0  200G  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot
├─nvme0n1p2 259:2    0  100G  0 part /
├─nvme0n1p3 259:3    0   50G  0 part /data
├─nvme0n1p4 259:4    0    1K  0 part 
└─nvme0n1p5 259:5    0    2G  0 part [SWAP][root@rocky8 ~]# mount /dev/sr0 /var/www/html/centos/6/os/x86_64/
mount: /var/www/html/centos/6/os/x86_64: WARNING: device write-protected, mounted read-only.
[root@rocky8 ~]# mount /dev/sr1 /var/www/html/centos/7/os/x86_64/
mount: /var/www/html/centos/7/os/x86_64: WARNING: device write-protected, mounted read-only.
[root@rocky8 ~]# mount /dev/sr2 /var/www/html/rocky/8/os/x86_64/
mount: /var/www/html/rocky/8/os/x86_64: WARNING: device write-protected, mounted read-only.

1.5 准备kickstart文件

[root@rocky8 ~]# mkdir /var/www/html/ks/
[root@rocky8 ~]# ls
anaconda-ks.cfg  centos6.cfg  centos7.cfg  rocky8.cfg
[root@rocky8 ~]# mv centos* rocky8.cfg /var/www/html/ks/
[root@rocky8 ~]# ls /var/www/html/ks/
centos6.cfg  centos7.cfg  rocky8.cfg
​
[root@rocky8 ~]# vim /var/www/html/ks/yum6.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-11-30
#FileName:      yum6.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[updates]
name=updates
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.cloud.tencent.com/epel/$releasever/$basearch/
gpgcheck=1
gpgkey=https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
​
[root@rocky8 ~]# vim /var/www/html/ks/yum7.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-11-30
#FileName:      yum7.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[updates]
name=updates
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.cloud.tencent.com/epel/$releasever/$basearch/
gpgcheck=1
gpgkey=https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
​
[root@rocky8 ~]# vim /var/www/html/ks/yum8.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-11-30
#FileName:      yum8.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[BaseOS]
name=BaseOS
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
​
[AppStream]
name=AppStream
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/AppStream/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
​
[extras]
name=extras
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/extras/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1[plus]
name=plus
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/plus/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
​
[PowerTools]
name=PowerTools
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.sjtug.sjtu.edu.cn/fedora/epel/$releasever/Everything/$basearch/
gpgcheck=1
gpgkey=https://mirrors.sjtug.sjtu.edu.cn/fedora/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
​
[root@rocky8 ~]# cat /var/www/html/ks/centos6.cfg 
# Kickstart file automatically generated by anaconda.#version=DEVEL
install
text
reboot
url --url=http://172.31.1.8/centos/6/os/x86_64/
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted $6$eAT2HmLxImeMrIbd$jP8mNSU6/A9/ISOSP6dc72h6mbbfzTsCFMEcfL8c7PNla8L9wGQnW5Nl8wuP5mHFkoxlwIQNt3jjcErIE.w9H/
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel
part /boot --fstype="ext4" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="ext4" --grow --size=1
​
%packages
@core
@server-policy
@workstation-policy
vim
lrzsz
%end
​
%post
curl http://172.31.1.8/ks/yum6.sh |bash
%end
​
[root@rocky8 ~]# cat /var/www/html/ks/centos7.cfg 
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$r6bueld4$D66DkBZeburidFINHY6Pf1
# System language
lang en_US
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
​
​
# Firewall configuration
firewall --disabled
# Network information
network  --bootproto=dhcp --device=eth0
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Use network installation
url --url="http://172.31.1.8/centos/7/os/x86_64"
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1
​
%post
curl http://172.31.1.8/ks/yum7.sh |bash
%end
​
%packages
vim
lrzsz
@core
%end
​
[root@rocky8 ~]# cat /var/www/html/ks/rocky8.cfg 
#version=RHEL8
# Use graphical install
reboot
text
url --url="http://172.31.1.8/rocky/8/os/x86_64"
selinux --disabled
firewall --disabled
​
%packages
@^minimal-environment
kexec-tools
vim
lrzsz
%end
​
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
​
# Network information
network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network  --hostname=localhost.localdomain
​
# Run the Setup Agent on first boot
firstboot --disabled
​
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1# System timezone
timezone Asia/Shanghai --isUtc --nontp
​
# Root password
rootpw --iscrypted $6$1p3L2ik4nOlvKZV4$rQdULbSTNv22KpUksNUINmWVOgEpXOPgLbgxiXdI.VnPeure6xrEQXI9QTQ6X1P9LQorkJHH2p7OSRl5LmgIB.
​
%addon com_redhat_kdump --enable --reserve-mb='auto'
​
%end
​
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
​
%post
curl http://172.31.1.8/ks/yum8.sh |bash
%end

1.6 准备PXE启动相关文件

[root@rocky8 ~]# mkdir /var/lib/tftpboot/centos{6,7}
[root@rocky8 ~]# mkdir /var/lib/tftpboot/rocky8
​
#准备CentOS6,78各自的内核相关文件
[root@rocky8 ~]# cp /var/www/html/centos/6/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/
[root@rocky8 ~]# cp /var/www/html/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/rocky8/
[root@rocky8 ~]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot/
​
#以下三个文件是CentOS8安装所必须文件,CentOS6,7则不需要
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/{ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/
​
#生成安装菜单文件
[root@rocky8 ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
​
#最终目录结构如下
[root@rocky8 ~]# tree /var/lib/tftpboot
/var/lib/tftpboot
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│   └── default
└── rocky8
    ├── initrd.img
    └── vmlinuz
​
4 directories, 12 files

1.7 准备启动菜单文件

[root@rocky8 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
timeout 600menu title CentOS Linuxlabel linux8
  menu label Auto Install Rocky Linux ^8
  kernel rocky8/vmlinuz
  append initrd=rocky8/initrd.img ks=http://172.31.1.8/ks/rocky8.cfglabel linux7
  menu label Auto Install CentOS Linux ^7
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://172.31.1.8/ks/centos7.cfglabel linux6
  menu label Auto Install CentOS Linux ^6
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img ks=http://172.31.1.8/ks/centos6.cfglabel manual
  menu label ^Manual Install Rocky Linux 8.5
  kernel rocky8/vmlinuz
  append initrd=rocky8/initrd.img inst.repo=http://172.31.1.8/rocky/8/os/x86_64/label rescue
  menu label ^Rescue a CentOS Linux system 8
  kernel rocky8/vmlinuz
  append initrd=rocky8/initrd.img inst.repo=http://172.31.1.8/rocky/8/os/x86_64/ rescuelabel local
  menu default
  menu label Boot from ^local drive
  localboot 0xffff
menu end
:wq! #需要强制保存

1.8 测试客户端基于PXE实现自动安装

新准备一台主机,设置网卡引导,可看到看启动菜单,并实现自动安装

注意:VMware workstation 对于不同的CentOS 版本,生成的虚拟机的硬件并不兼容

041.jpg

042.jpg

043.jpg

自动安装Rocky 8 044.jpg

安装过程

045.jpg

046.jpg

自动安装CentOS 7

047.jpg

安装过程

048.jpg

049.jpg

自动安装CentOS 6

050.jpg

安装过程

051.jpg

052.jpg