十分装200台机器,批量装机不求人!一个运维的血泪史和实战经验分享
想象下如果现在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自动化部署的完整过程:
主要阶段:
网络引导阶段:
- 客户端通过PXE网络启动
- DHCP分配IP并指向TFTP服务器
- 下载引导文件和内核
安装准备阶段:
- 加载安装内核和初始化文件
- 获取Kickstart等配置文件
自动化安装阶段:
- 根据预定义配置自动安装系统
- 下载软件包和进行系统配置
完成阶段:
- 安装完成后重启进入新系统
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等工具来管理应用。
最后的最后
批量装机这个技术说起来也算是运维的基本功了。虽然现在有很多更先进的技术,但是掌握这些基础技能还是很有必要的。
我记得刚开始做运维的时候,看到别人能够批量安装几十台服务器,觉得特别神奇。后来自己学会了,才发现其实原理并不复杂,关键是要理解整个流程,然后细心地配置每一个环节。
技术这个东西,说难也难,说简单也简单。难的是要理解背后的原理,简单的是一旦掌握了,就可以举一反三。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记