CentOS运维中,如果你还在一台台手动安装系统、配置分区、装软件包,那效率低得让人崩溃。Kickstart就是Red Hat系Linux提供的无人值守自动安装方案,核心就是一个应答文件(ks.cfg),里面写满了安装过程中所有问题的预设答案。把这个文件放到安装源里,系统启动时自动读取,全程不需要人工干预,十分钟装好一台机器,批量部署几十台也就是改改IP和主机名的事。下面我把从搭建环境到编写完整应答文件,再到实际部署的全流程给你讲透。
什么是Kickstart以及它的工作原理Kickstart本质上是一个纯文本的配置文件,里面用关键字定义了安装过程中每一步的行为。比如语言选什么、键盘布局用哪种、磁盘怎么分区、网络怎么配、装哪些软件包、root密码设成什么。安装程序(Anaconda)在启动时会去寻找这个文件,找到后就按照文件里的指令自动执行,跳过所有交互提示。你可以把它理解成给安装程序写了一份"标准答案",程序照着抄就行。
Kickstart的工作流程是这样的:首先你需要一个安装源(ISO镜像或网络源),然后把ks.cfg文件放到这个源的根目录或者通过网络(HTTP/FTP/NFS)提供访问。安装时在启动引导界面按Tab键或者在引导参数里指定ks=http://xxx/ks.cfg,Anaconda就会去拉取这个文件并开始自动安装。整个过程不需要任何键盘输入,除非你主动加了交互指令。
搭建Kickstart自动部署环境要实现自动部署,你至少需要三样东西:一个CentOS安装镜像、一个能提供文件访问的服务、一个存放应答文件的位置。最简单的方式是用HTTP服务,因为配置轻量、兼容性好。假设你的部署服务器IP是192.168.1.100,操作步骤如下。
第一步,挂载CentOS ISO镜像并复制文件到Web目录:
mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt mkdir -p /var/www/html/centos7 cp -r /mnt/* /var/www/html/centos7/
第二步,确保HTTP服务已启动并设置开机自启:
systemctl start httpd systemctl enable httpd
第三步,把你写好的ks.cfg文件放到/var/www/html/目录下,这样访问路径就是http://192.168.1.100/ks.cfg。如果你用的是CentOS 8 Stream或者Rocky Linux,原理完全一样,只是镜像文件名和软件包管理工具换成了dnf。
编写完整的Kickstart应答文件这是整篇文章最核心的部分。一个生产环境可用的ks.cfg文件通常包含以下几个大模块:命令段、软件包段、分区段、网络段、用户和认证段、脚本段。我直接给你一个可以直接用的完整模板,基于CentOS 7,你根据自己的需求改参数就行。
# Kickstart文件 - CentOS 7 自动安装配置 # 版本: 1.0 # 适用场景: 服务器批量部署 # ========== 命令段 ========== install cdrom lang en_US.UTF-8 keyboard us timezone Asia/Shanghai --isUtc rootpw --iscrypted $6$rounds=656000$your_salt_here$encrypted_password_hash user --name=deploy --password=$6$rounds=656000$salt$hash --groups=wheel auth --useshadow --passalgo=sha512 selinux --disabled firewall --disabled firstboot --disable skipx # ========== 引导加载器 ========== bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" # ========== 磁盘分区 ========== clearpart --all --initlabel autopart --type=lvm # 或者用手动分区: # part /boot --fstype=xfs --size=1024 --ondisk=sda # part swap --fstype=swap --size=4096 --ondisk=sda # part / --fstype=xfs --grow --size=1 --ondisk=sda # ========== 网络配置 ========== network --bootproto=static --device=eth0 --ip=192.168.1.50 --netmask=255.255.255.0 --gateway=192.168.1.1 --nameserver=8.8.8.8 --hostname=server01.example.com --onboot=yes --noipv6 # ========== 软件包 ========== %packages @^minimal @core wget curl vim net-tools bash-completion epel-release %end # ========== 安装后脚本 ========== %post --log=/root/ks-post.log # 更新系统 yum -y update # 配置SSH sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config systemctl enable sshd # 关闭不需要的服务 systemctl disable postfix %end %post --nochroot --log=/root/ks-post-nochroot.log # 这里写chroot外执行的命令 %end %pre --log=/root/ks-pre.log # 安装前脚本,一般用来做环境检查 echo "Starting automated installation..." > /tmp/ks-pre.log %end reboot
上面这个文件里有几个关键点需要你注意。rootpw那一行用的是加密后的密码,你不能直接写明文。生成加密密码的方法是用grub-crypt或者python:
python -c 'import crypt; print(crypt.crypt("你的密码", crypt.mksalt(crypt.METHOD_SHA512)))'
把输出的字符串替换掉模板里的$6$...部分就行。网络配置那一段,如果你是DHCP环境,把bootproto改成dhcp,去掉IP相关参数即可。分区方案我给了两种选择,autopart是自动LVM分区,适合快速部署;手动分区适合有严格要求的生产环境,比如/boot单独分区、swap固定大小、/用剩余空间。
启动时指定Kickstart文件的方法文件准备好了,怎么让安装程序找到它?有三种常用方式。
方式一:在ISO镜像里直接放入。把ks.cfg复制到ISO根目录,重新打包ISO(CentOS 7用mkisofs,CentOS 8用xorriso)。启动时不需要额外参数,Anaconda会自动在CD里找ks.cfg。
方式二:通过网络指定。在启动引导界面按Tab键,在linux那一行末尾加上:
ks=http://192.168.1.100/ks.cfg
如果网络需要配置才能访问,还可以加上网络参数:
ks=http://192.168.1.100/ks.cfg ip=192.168.1.50 netmask=255.255.255.0 gateway=192.168.1.1
方式三:用PXE网络引导。配置DHCP服务器指向TFTP上的引导文件,同时在pxelinux.cfg/default里加上ks参数。这是大规模机房部署的标准做法,一台PXE服务器可以同时给几十台机器发不同的应答文件。
针对CentOS 8/9和Rocky/Alma的适配说明CentOS 8之后,Anaconda有了变化,部分关键字被废弃或改名。比如"lang"改成了"lang"、"keyboard"还在但推荐用"keyboard --xlayouts='us'",软件包段从%packages变成了%packages --ignoremissing,而且默认用dnf替代yum。分区方面,autopart依然可用,但推荐明确写part命令。另外CentOS 8开始默认不再支持ks=cdrom,建议用网络方式。如果你迁移到了Rocky Linux 9,整体语法基本兼容CentOS 7的风格,只是软件包组名称有变化,比如@core变成了@base。
生产环境中的实用技巧和避坑指南第一,%post脚本里的命令要谨慎。安装后脚本是以root权限运行的,写错了可能把系统搞坏。建议先在单机上测试ks.cfg,确认没问题再批量用。可以在%post开头加set -x让命令回显,方便排错。
第二,不要在ks.cfg里写敏感信息的明文。除了密码要加密,如果有数据库密码、API密钥之类的,建议在%post脚本里从配置管理工具(如Ansible、SaltStack)拉取,而不是硬编码在文件里。
第三,日志文件很重要。%post和%pre都可以加--log参数指定日志路径,安装完去/root/目录下看日志,能快速定位哪一步出了问题。很多人忽略这个,出了错只能重来。
第四,网络配置要和实际环境匹配。如果你的机器有多块网卡,network命令只会配置第一块。要配多网卡需要写多条network命令,或者在%post里用nmcli/ip命令补配。另外,--noipv6在某些新版本里可能被忽略,需要手动在%post里关掉。
第五,批量部署时建议用模板+变量的方式管理ks.cfg。比如用Python或Shell脚本根据主机名、IP、角色生成不同的应答文件,而不是手动改几十个文件。这才是真正的自动化运维思维。
总结与延伸Kickstart是CentOS系Linux自动化部署的基石工具,虽然现在有更现代的方案比如Cloud-Init、Ansible+PXE、Cobbler等,但Kickstart的简单直接和零依赖特性让它在很多场景下依然是首选。掌握它的核心不是背命令,而是理解每个模块的作用,然后根据自己的基础设施灵活组合。把上面的模板吃透,改成适合你环境的版本,你的服务器部署效率至少提升十倍。
