想象下如果现在idc机房有200台服务器,你该如何办呢?是200台机器一台一台装系统,还是直接批量装机?200台,一人一天装10台也两个人也只要20天,一个月都不要。但是来都来了,不搞个批量装机那我老板要我有何用(打工人的觉悟)!!!

不过话说回来,做运维这么多年,批量装机这种事情遇到的次数也不少了。从最开始的手工一台台装,到后来用各种自动化工具,这中间踩过的坑能绕地球三圈。今天就跟大家分享一下批量装机的那些事儿,希望能帮到正在为装机发愁的朋友们。

批量装机到底是个什么原理

说白了,批量装机就是让多台机器同时安装操作系统,而不是一台一台手动安装。这个过程主要依赖网络启动技术,最常用的就是PXE(Preboot Execution Environment)。

PXE这个东西其实挺有意思的,它是Intel搞出来的一个标准,允许计算机通过网络接口启动。简单来说就是机器开机后不从硬盘启动,而是从网络上下载启动文件。这样我们就可以在网络上放一个统一的系统镜像,所有机器都从这里启动安装。

整个流程大概是这样的:机器开机 → 网卡发送DHCP请求 → DHCP服务器分配IP并告诉它TFTP服务器地址 → 机器从TFTP服务器下载启动文件 → 启动安装程序 → 从HTTP/FTP服务器下载系统镜像进行安装。

听起来好像很复杂,但实际操作起来还是比较直观的。关键是要把各个服务配置好,让它们能够协同工作。

我的批量装机方案选择

市面上批量装机的方案其实挺多的,比如Cobbler、Foreman、还有各种商业化的解决方案。我个人比较偏爱Cobbler,主要是因为它配置相对简单,而且功能够用。

Cobbler这个工具是用Python写的(我熟悉),它把DHCP、TFTP、HTTP等服务都整合在一起了,配置起来比较省心。而且它支持多种Linux发行版,CentOS、Ubuntu、SUSE都没问题。

当然了,如果你们公司预算充足,也可以考虑一些商业化的方案,比如Red Hat的Satellite或者SUSE Manager。这些工具功能更强大,但是学习成本也相对高一些。

我来为您绘制一个Cobbler运行的流程图:

flowchart TD
    A[客户端启动] --> B[发送DHCP请求]
    B --> C[DHCP服务器响应]
    C --> D[获取IP地址和引导信息]
    D --> E[通过TFTP下载PXE引导文件]
    E --> F[加载内核和initrd]
    F --> G[启动安装程序]
    G --> H[请求Kickstart配置文件]
    H --> I[Cobbler生成配置文件]
    I --> J[开始自动化安装]
    J --> K[下载软件包]
    K --> L[系统配置]
    L --> M[安装完成重启]
    M --> N[系统正常启动]

    subgraph "Cobbler服务器组件"
        O[Cobbler管理服务]
        P[DHCP服务]
        Q[TFTP服务]
        R[HTTP/FTP服务]
        S[配置文件模板]
    end

    subgraph "配置管理"
        T[Distro管理]
        U[Profile管理]
        V[System管理]
        W[Repository管理]
    end

    B -.-> P
    E -.-> Q
    H -.-> R
    I -.-> S
    K -.-> R

    O --> T
    O --> U
    O --> V
    O --> W

这个流程图展示了Cobbler自动化部署的完整过程:

主要阶段:

  1. 网络引导阶段

    • 客户端通过PXE网络启动
    • DHCP分配IP并指向TFTP服务器
    • 下载引导文件和内核
  2. 安装准备阶段

    • 加载安装内核和初始化文件
    • 获取Kickstart等配置文件
  3. 自动化安装阶段

    • 根据预定义配置自动安装系统
    • 下载软件包和进行系统配置
  4. 完成阶段

    • 安装完成后重启进入新系统

Cobbler核心组件包括配置管理(Distro、Profile、System)和服务组件(DHCP、TFTP、HTTP等),协同完成整个自动化部署流程。

环境准备和基础配置

在开始配置之前,我们需要准备一台服务器作为部署服务器。这台机器的配置不用太高,但是网络一定要稳定,因为所有的安装流量都会经过它。

我一般会选择CentOS 7作为部署服务器的操作系统,主要是因为稳定性好,而且Cobbler在CentOS上的兼容性最好。

首先关闭防火墙和SELinux,这个步骤很重要,不然后面会遇到各种奇怪的问题:

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

然后安装EPEL源,因为Cobbler在EPEL源里:

yum install -y epel-release
yum makecache

Cobbler的安装和初始配置

安装Cobbler及相关组件:

yum install -y cobbler cobbler-web dhcp tftp-server pykickstart httpd xinetd

安装完成后启动相关服务:

systemctl enable cobblerd
systemctl start cobblerd
systemctl enable httpd
systemctl start httpd
systemctl enable xinetd
systemctl start xinetd

接下来需要修改Cobbler的主配置文件/etc/cobbler/settings。这个文件里的配置项比较多,我挑几个重要的说一下:

# 服务器IP地址
server: 192.168.1.100

# TFTP服务器地址
next_server: 192.168.1.100

# 管理网段
manage_dhcp: 1
manage_tftpd: 1

# 默认root密码(需要加密)
default_password_crypted: "$1$mF86/UHC$WvcIcX2t6crBz2onWxyac."

这里的密码需要用openssl生成加密字符串:

openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'

DHCP服务配置

DHCP配置是批量装机的关键环节,它负责给客户端分配IP地址,并告诉客户端从哪里下载启动文件。

编辑/etc/cobbler/dhcp.template文件:

subnet 192.168.1.0 netmask 255.255.255.0 {
     option routers             192.168.1.1;
     option domain-name-servers 192.168.1.1;
     option subnet-mask         255.255.255.0;
     range dynamic-bootp        192.168.1.200 192.168.1.250;
     default-lease-time         21600;
     max-lease-time             43200;
     next-server                $next_server;
     class "pxeclients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
          if option pxe-system-type = 00:02 {
                  filename "ia64/elilo.efi";
          } else if option pxe-system-type = 00:06 {
                  filename "grub/grub-x86.efi";
          } else if option pxe-system-type = 00:07 {
                  filename "grub/grub-x86_64.efi";
          } else if option pxe-system-type = 00:09 {
                  filename "grub/grub-x86_64.efi";
          } else {
                  filename "pxelinux.0";
          }
     }
}

这个配置看起来复杂,但实际上就是定义了一个网段,设置了IP分配范围,然后根据不同的系统架构指定不同的启动文件。

导入系统镜像

有了基础环境,接下来就要导入系统镜像了。这一步相对简单,但是要注意镜像的选择。

首先挂载ISO镜像:

mkdir /mnt/centos7
mount -o loop CentOS-7-x86_64-DVD-1908.iso /mnt/centos7

然后导入到Cobbler:

cobbler import --arch=x86_64 --path=/mnt/centos7 --name=CentOS-7-x86_64

导入过程会比较慢,因为要复制整个镜像文件。导入完成后可以查看一下:

cobbler distro list
cobbler profile list

如果看到对应的发行版和配置文件,说明导入成功了。

Kickstart文件配置

Kickstart文件是自动化安装的核心,它定义了系统安装的各种参数,比如分区方案、软件包选择、网络配置等。

Cobbler会自动生成一个默认的Kickstart文件,但通常需要根据实际需求进行修改。默认文件在/var/lib/cobbler/kickstarts/目录下。

我一般会创建一个自定义的Kickstart文件:

cp /var/lib/cobbler/kickstarts/sample_end.ks /var/lib/cobbler/kickstarts/centos7-custom.ks

然后编辑这个文件,添加自己需要的配置:

#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use network installation
url --url="http://192.168.1.100/cobbler/ks_mirror/CentOS-7-x86_64/"
# Use graphical install
text
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --activate
network  --hostname=localhost.localdomain

# Root password
rootpw --iscrypted $default_password_crypted
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel

%packages
@^minimal
@core
chrony
kexec-tools
%end

%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
# 这里可以添加安装后的自定义脚本
echo "Installation completed at $(date)" >> /root/install.log
%end

这个Kickstart文件定义了最小化安装,使用LVM分区,并且在安装完成后会在/root目录下创建一个安装日志。

创建自定义Profile

有了Kickstart文件,接下来需要创建一个自定义的Profile:

cobbler profile add --name=CentOS-7-x86_64-custom --distro=CentOS-7-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos7-custom.ks

这样就创建了一个使用自定义Kickstart文件的Profile。

同步配置和测试

所有配置完成后,需要同步一下配置:

cobbler sync

这个命令会生成DHCP配置文件、TFTP启动文件等,并重启相关服务。

同步完成后可以检查一下服务状态:

cobbler check

如果有问题,这个命令会给出相应的提示。

客户端安装测试

配置完成后就可以测试客户端安装了。将需要安装系统的机器设置为网络启动,然后开机。

正常情况下,机器会从网络获取IP地址,然后下载启动文件,进入安装界面。整个安装过程是全自动的,不需要人工干预。

我记得第一次看到几十台机器同时自动安装系统的场景,那感觉真的很震撼。就像看着一个个机器人在自己组装自己一样。

一些实际使用中的技巧

在实际使用过程中,我总结了一些小技巧,可能对大家有用。

比如说,如果你需要给不同的机器安装不同的系统或者使用不同的配置,可以通过MAC地址绑定的方式来实现:

cobbler system add --name=server01 --mac=00:11:22:33:44:55 --profile=CentOS-7-x86_64-custom --ip-address=192.168.1.101 --hostname=server01

这样指定MAC地址的机器就会使用特定的配置进行安装。

另外,如果网络环境比较复杂,有多个VLAN,可能需要配置DHCP中继。这个就需要在网络设备上配置ip helper-address,让DHCP请求能够转发到Cobbler服务器。

还有一个需要注意的地方是,批量装机对网络带宽的要求比较高。如果同时有很多台机器在安装,网络可能会成为瓶颈。我之前遇到过一次,50台机器同时安装,把千兆网络跑满了,结果安装速度反而变慢了。后来分批安装,效果好了很多。

故障排查经验

批量装机过程中难免会遇到各种问题,我把常见的几种情况和解决方法分享一下。

最常见的问题是客户端无法获取IP地址。这种情况通常是DHCP配置有问题,或者网络连通性有问题。可以先用tcpdump抓包看看DHCP请求是否到达服务器:

tcpdump -i eth0 port 67 or port 68 -v

如果看不到DHCP请求,那就是网络问题,需要检查网线、交换机配置等。如果能看到请求但是没有响应,那就是DHCP服务配置有问题。

另一个常见问题是能获取IP但是无法下载启动文件。这通常是TFTP服务的问题。可以手动测试一下:

tftp 192.168.1.100
get pxelinux.0

如果无法下载,检查xinetd服务是否正常,还有TFTP的配置文件/etc/xinetd.d/tftp

还有就是安装过程中卡住不动,这种情况比较复杂。可能是Kickstart文件语法错误,也可能是软件包依赖问题。建议先在虚拟机里测试Kickstart文件,确保没问题再用于生产环境。

有一次我遇到一个很奇怪的问题,就是安装到一半突然重启,然后又重新开始安装,形成了死循环。后来发现是因为机器的BIOS设置有问题,网络启动的优先级设置得太高了。安装完成后应该从硬盘启动,但是它还是从网络启动,所以就一直循环安装。

Web界面管理

Cobbler还提供了一个Web管理界面,虽然功能没有命令行那么全面,但是对于日常管理还是很方便的。

访问https://192.168.1.100/cobbler_web就可以进入Web界面。默认用户名是cobbler,密码需要设置一下:

htdigest /etc/cobbler/users.digest "Cobbler" cobbler

Web界面可以查看系统状态、管理Profile、查看安装日志等,对于不熟悉命令行的同事来说比较友好。

与其他工具的集成

在实际工作中,批量装机往往不是一个独立的过程,还需要与其他运维工具集成。

比如说,安装完系统后可能需要自动加入配置管理系统,像Puppet、Ansible等。这个可以在Kickstart文件的%post段落里添加相应的脚本:

%post
# 安装Puppet客户端
rpm -ivh https://yum.puppetlabs.com/puppet5/puppet5-release-el-7.noarch.rpm
yum install -y puppet-agent

# 配置Puppet服务器
echo "192.168.1.50 puppet" >> /etc/hosts

# 启动Puppet服务
systemctl enable puppet
systemctl start puppet
%end

还可以与监控系统集成,比如在安装完成后自动安装Zabbix Agent或者Nagios客户端。

大规模部署的注意事项

当需要部署的机器数量比较多的时候,就需要考虑一些额外的问题了。

首先是网络带宽问题。我之前提到过,如果同时安装的机器太多,网络可能会成为瓶颈。一般来说,千兆网络同时支持20-30台机器安装是没问题的,但是如果超过这个数量,就需要考虑分批安装或者增加带宽。

其次是服务器性能问题。虽然Cobbler服务器的配置要求不高,但是当客户端数量很多的时候,HTTP服务的压力会比较大。可能需要调整Apache的配置,增加并发连接数。

还有就是IP地址规划问题。如果机器数量很多,需要提前规划好IP地址段,避免地址冲突。

朋友给我分享一次他给一个数据中心部署了500台服务器,整个过程用了两天时间。虽然大部分是自动化的,但是还是需要人工监控整个过程,及时处理各种异常情况。那两天基本上没怎么睡觉,但是看到所有机器都正常安装完成,那种成就感还是很爽的。

安全方面的考虑

批量装机涉及到网络启动,在安全方面需要特别注意。

首先,DHCP服务器应该只在内网环境中使用,不要暴露到公网。而且最好限制DHCP服务的网段,避免影响其他网络设备。

其次,TFTP和HTTP服务也应该做好访问控制。虽然这些服务在安装过程中需要开放,但是平时可以关闭或者限制访问。

还有就是Kickstart文件中的密码问题。虽然密码是加密的,但是还是建议安装完成后及时修改默认密码。

云环境下的批量装机

现在很多公司都在使用云服务,云环境下的批量装机和传统环境有一些不同。

大部分云服务商都提供了自己的镜像服务,可以制作自定义镜像,然后批量创建虚拟机。这种方式比传统的PXE安装要快很多,而且更稳定。

但是如果需要在云环境中使用PXE安装,也是可以的。只是需要注意网络配置,确保DHCP请求能够正确路由。

未来发展趋势

虽然现在容器和云原生技术很火,但是传统的批量装机在某些场景下还是有其价值的。特别是在边缘计算、私有云建设等场景中。

而且,理解批量装机的原理对于理解整个IT基础设施的运作很有帮助。很多概念,比如网络启动、自动化配置等,在其他技术领域也会用到。

我觉得未来的趋势可能是传统批量装机与云原生技术的结合。比如说,用传统方式安装基础系统,然后用Kubernetes等工具来管理应用。

最后的最后

批量装机这个技术说起来也算是运维的基本功了。虽然现在有很多更先进的技术,但是掌握这些基础技能还是很有必要的。

我记得刚开始做运维的时候,看到别人能够批量安装几十台服务器,觉得特别神奇。后来自己学会了,才发现其实原理并不复杂,关键是要理解整个流程,然后细心地配置每一个环节。

技术这个东西,说难也难,说简单也简单。难的是要理解背后的原理,简单的是一旦掌握了,就可以举一反三。

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

标签: none