
1. 为什么我放着PXE不用非要折腾Cobbler先说个场景公司新到了一批服务器你抱着系统光盘一台一台装装完一台还要敲一堆初始化配置装个五六台还能忍二十台往上呢手都能装出腱鞘炎。后来有人用PXE批量装确实省事不少但PXE本身只是个启动协议它不管你怎么定制安装、怎么管理镜像、怎么自动分区你依然得手工维护一堆配置文件每加一个新系统版本就要重新折腾一遍运维的活儿一点没少。我用Cobbler就是因为这玩意儿把PXE、DHCP、TFTP、HTTP这些底层服务全封装到了一起你只需要告诉它“我要装什么系统、装在哪台机器上、装完执行什么脚本”剩下的它自己协调。说白了Cobbler是给PXE穿了一件带管理界面的外套专门解决批量装机时“配置分散、版本混乱、流程靠人工”这三个老大难问题。这篇东西适合谁看适合那些被重复装系统折磨的运维新手适合刚接手批量交付环境的测试工程师也适合想在虚拟机上先练练手的同学。读完你可以搭出一套能用的Cobbler环境把一台裸机从开机到系统装完、再自动配好IP和初始化脚本的流程全跑通。如果你已经在大厂用着Foreman或者Spacewalk那这篇可以跳过但如果你想搞明白批量装机底层是怎么回事跟着走一遍也不亏。2. 装之前你得先明白Cobbler到底干了什么事2.1 Cobbler和PXE、DHCP、TFTP之间是什么关系先打个比方。PXE相当于“开机引导协议”它让一台没有系统的机器从网络上找到可以启动的文件DHCP负责“告诉机器去哪儿拿配置”TFTP负责“把最开始的启动文件发给机器”HTTP或者FTP负责“把完整的安装镜像传过去”。这几兄弟本来是各干各的配置分散在好几个文件里运维得自己记着改哪里。Cobbler做的事情是把上面这些服务的配置统一管起来。你在Cobbler里定义好一个“安装任务”它会自动帮你改好DHCP的配置、放好TFTP的启动文件、配好HTTP的镜像路径。这台机器一开机通过网络引导就能一路下载内核、加载安装源、读取应答文件最终完成无人值守安装。整个过程里人和命令行交互的次数被压到了最低。2.2 核心概念速览distro、profile、system和repo这四个词是理解Cobbler的关键其他所有操作基本都围绕它们展开。distro是“发行版”对应一个具体的操作系统安装源比如CentOS 7.9的ISO或者Ubuntu 22.04的ISO。Cobbler会把这个ISO里的内核、引导文件、安装数据整理成可供网络安装的格式。profile是“安装配置”它建立在distro之上定义了安装这个系统时用的ks应答文件、分区方案、软件包选择、root密码等。一个distro可以对应多个profile比如同一个CentOS镜像你可以做一个最小化安装的profile再做一个带图形界面的profile。system是“具体某台机器”它绑定一个profile同时指定这台机器的MAC地址、IP、主机名、网关、DNS等网络参数。每台机器一个system条目开机后Cobbler就能根据MAC地址自动匹配对应的安装配置实现“同一种镜像不同机器不同配置”。repo是“软件源”用来存放安装过程中需要额外安装的软件包。默认情况下Cobbler会用系统镜像自带的软件源但你也可以挂载内部Yum源避免安装时去公网拉包内网环境下这一步很关键。把这四个概念记住后面所有操作你都能看懂了。3. 环境准备我用的什么系统踩了什么坑3.1 操作系统与网络规划我这边测试用的是CentOS 7.964位Cobbler版本是3.3.3。你别盯着版本号看Cobbler的核心用法各个版本差异不大关键是系统环境要干净。服务器配置不用高2核4G内存、60G硬盘足够跑实验环境但硬盘建议留大一点因为后面要放多个ISO镜像每个镜像好几个G。网络规划很重要Cobbler服务器需要一块静态IP我这边用的内网地址是192.168.100.10网关192.168.100.2DNS用的公司内网DNS。为什么强调静态IP因为Cobbler要同时提供DHCP服务如果它自己的IP是动态获取的那客户端连它的DHCP请求就会产生循环依赖机器一重启IP变了整个安装服务就瘫了。这一点是新手最容易忽略的。另外你还需要关闭防火墙和SELinux。命令是systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config希望你别学我我第一次搭的时候图省事只关了防火墙忘了SELinux结果TFTP服务怎么都起不来折腾了半天才发现是SELinux拦截了。后面所有实验都在关闭状态下跑干净利落。3.2 安装Cobbler及其依赖CentOS 7的默认源里没有Cobbler需要通过EPEL源安装。先把EPEL装上yum install -y epel-release然后安装Cobbler及相关组件yum install -y cobbler cobbler-web tftp-server dhcp httpd pykickstart这里说明一下每个包的作用cobbler是主程序cobbler-web是Web管理界面tftp-server提供网络启动文件传输dhcp负责给客户端分配IPhttpd提供HTTP安装源pykickstart用于生成和处理应答文件。装完检查一下版本cobbler version如果输出里能看到版本号说明主程序正常。接着启动httpd和cobblerd并设置开机自启systemctl start httpd cobblerd systemctl enable httpd cobblerd4. 初始化配置这步不弄好后面全白搭4.1 运行cobbler check逐项排查Cobbler装好后先别急着加镜像先跑一个检查命令看看哪些配置没到位cobbler check这条命令会列出一堆提示常见的有需要修改/etc/cobbler/settings文件中server和next_server的IP地址需要安装或启动某些服务需要下载对应的引导文件需要对某个目录设置软链接每条提示都不是白给的基本都对应着一个潜在问题。下面我按实际排查顺序讲。4.2 修改server与next_server配置打开/etc/cobbler/settings找到下面两个关键项server: 192.168.100.10 next_server: 192.168.100.10server用于指定Cobbler服务对外提供下载和安装服务的地址next_server用于指定TFTP服务器的地址。很多人只改server忘了改next_server结果客户端能拿到引导文件却下载不到内核就是因为TFTP地址不对。4.3 设置root密码并生成加密串Cobbler另一个关键配置是默认root密码。在settings文件里找到default_password_crypted这一项你直接填明文密码是不行的Cobbler要求填加密后的字符串。生成方式openssl passwd -salt cobbler -1 你要设置的密码把输出的加密串填到default_password_crypted后面保存退出。这样做的好处是每当新建profile没指定密码时系统会统一用这个默认密码装机后你就能用设定的密码登录系统。4.4 下载引导文件与配置DHCP模板Cobbler check跑完后通常还会提示缺少pxelinux.0等引导文件。执行下面命令自动下载cobbler get-loaders如果内网环境下载不了可以从已经装好的系统里拷贝路径一般是/usr/share/syslinux/pxelinux.0手动放到/var/lib/cobbler/loaders/下再重新跑cobbler sync让它生效。接下来配置DHCP模板。Cobbler本身不自带DHCP服务它只是修改dhcpd的配置文件模板所以你要先设置让Cobbler接管DHCP。在settings里找到manage_dhcp改为manage_dhcp: 1然后打开/etc/cobbler/dhcp.template这是DHCP配置模板里面要按你的网段修改subnet、netmask、router、range等参数。比如我这边改成subnet 192.168.100.0 netmask 255.255.255.0 { option routers 192.168.100.2; option domain-name-servers 192.168.100.2; option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.100.100 192.168.100.200; }注意range这一段是给客户端动态分配IP用的地址池。如果某台机器在Cobbler里已经定义了system条目并绑定了具体IP那它不受这个动态池的限制会优先使用system里指定的地址。4.5 执行cobbler sync让配置生效每次改了settings、模板、或者添加了新的distro和profile都要执行同步cobbler sync这条命令会把刚才的配置生成到对应服务的实际配置文件中比如生成/etc/dhcp/dhcpd.conf、/etc/xinetd.d/tftp、重启相关服务。同步完再跑cobbler check正常情况下剩下的提示应该很少了。如果你看到cobbler check还是提示tftp服务有问题多半是tftp被xinetd托管检查一下/etc/xinetd.d/tftp里的disable字段是不是yes如果是改成no然后重启xinetd服务。这里是大家最爱踩坑的地方之一。很多人改了配置不sync直接加镜像结果镜像加进去了但客户端启动时就是找不到启动文件折腾半天最后发现sync一下全解决。记住这个习惯任何重要修改之后务必cobbler sync。5. 导入ISO镜像把安装源交给Cobbler5.1 挂载ISO文件到本地目录先准备一个CentOS 7.9的ISO镜像我用的是CentOS-7-x86_64-Minimal-2009.iso。把它挂载到一个用户目录下mkdir -p /mnt/centos7 mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/centos7注意如果你是想用光盘直接导入那就把光盘对应的设备节点挂载上比如mount /dev/cdrom /mnt/centos7。用ISO文件的好处是可以多版本并存一个文件一个挂载点互不干扰。5.2 使用cobbler import命令导入导入命令cobbler import --path/mnt/centos7 --nameCentOS-7.9 --archx86_64这里三个参数的含义path指定镜像挂载路径name定义这个distro在Cobbler里的名字你可以按自己的规范命名比如CentOS-7.9-x86_64arch指定架构x86_64对应64位导入过程会复制文件到/var/www/cobbler/ks_mirror/目录同时自动生成对应的distro和一个默认的profile。这个profile的名称通常是name参数里指定的名字比如CentOS-7.9-x86_64。5.3 确认导入结果与默认profile导入完成后跑cobbler distro list cobbler profile list能看到刚刚导入的发行版和自动化创建的profile。这里要注意Cobbler自动生成的profile使用的是它内置的默认应答文件一般不会完全符合你的需求后面我们会改成自定义的ks文件。如果你导入的是Ubuntu或者Debian镜像流程基本一致不过它们的引导机制略有不同Cobbler的处理方式也不一样。我这次以CentOS为主其他系统你可以在熟练之后再尝试。6. 自定义ks应答文件装完不仅要开机还要能用6.1 ks文件的作用ks文件全称Kickstart是Anaconda安装程序使用的应答文件。它告诉安装程序磁盘怎么分区、使用什么软件源、安装哪些软件包、root密码是什么、时区怎么设置、安装后要执行什么脚本。有了它安装过程可以不问任何问题一路自动跑完。Cobbler里每个profile都会对应一个ks文件。默认的那个虽然在/var/lib/cobbler/kickstarts/目录下存在但内容比较基础生产环境通常要按需定制。下面我贴一份精简但能用的ks文件你可以存成centos7-ks.cfg# Kickstart for CentOS 7.9 install url --url$tree lang en_US.UTF-8 keyboard us rootpw --iscrypted $default_password_crypted timezone Asia/Shanghai --isUtc text skipx zerombr clearpart --all --initlabel autopart --typelvm network --bootprotodhcp --deviceeth0 --onbootyes firstboot --disable selinux --disabled firewall --disabled services --enabledsshd %packages base net-tools lrzsz vim %end %post echo cobbler install done /tmp/install_finish.log %end reboot简单解释几个关键点url --url$tree 这行用的变量$treeCobbler在生成实际ks文件时会自动替换成对应的HTTP安装源地址不用你手动填。rootpw --iscrypted 后面的$default_password_crypted同样会被Cobbler替换成你在settings里配置的加密密码。autopart --typelvm表示自动分区并采用LVM逻辑卷适合大多数场景。%packages部分列了要额外安装的软件base是系统基础环境组net-tools提供ifconfig命令vim和lrzsz都是运维常用的工具。%post段可以在系统安装完成后执行自定义脚本我这里只是写了一个标记文件你完全可以在里面放初始化命令比如安装Agent、配置内部Yum源、修改SSH端口等。6.2 上传并关联ks文件到profile把上面这份文件保存到/var/lib/cobbler/kickstarts/centos7-ks.cfg然后执行cobbler profile edit --nameCentOS-7.9-x86_64 --kickstart/var/lib/cobbler/kickstarts/centos7-ks.cfg这条命令把ks文件关联到你最初导入时生成的profile上。然后重新同步cobbler sync6.3 验证ks文件是否被正确解析使用命令查看profile的ks配置是否生效cobbler profile report --nameCentOS-7.9-x86_64找到kickstart这一行确认路径已经变成你自己的文件路径。这一步做完Cobbler侧的自定义安装配置就准备好了。7. 添加system条目让每一台机器都有自己的安装计划7.1 为什么不用默认profile直接装你可能会问有默认profile直接启动安装不就行了为什么还要建system条目我不想再单独用一台机器测试。直接装没问题但那种情况下所有机器都用同一套网络配置都是DHCP自动获取IP装完之后你还要去机房看每台机器拿到了什么网段地址再改主机名改IP效率低到怀疑人生。用system条目的意义在于给每台机器分配一个固定的角色和网络身份开机即装、装完即通。比如新到一台测试服务器MAC地址是00:50:56:3E:12:34我知道它在测试网段应该叫test-server-01、IP是192.168.100.30那我在Cobbler里给这台机器建一个system条目它就会用我为它指定的IP、主机名、网关和DNS完成安装整个过程不需要再人工干预。7.2 创建system条目用下面命令创建一个system条目cobbler system add --nametest-server-01 --profileCentOS-7.9-x86_64创建后需要给这个system绑定硬件和网络信息cobbler system edit --nametest-server-01 --interfaceeth0 --mac00:50:56:3E:12:34 --ip-address192.168.100.30 --netmask255.255.255.0 --gateway192.168.100.2 --name-servers192.168.100.2 --hostnametest-server-01.example.com注意一个细节如果你用的是物理机MAC地址从BIOS或者带外管理系统查如果是虚拟机直接在虚拟机的网络配置里看就行。MAC地址必须对因为Cobbler就是靠它识别客户端的。7.3 system条目常见权限与覆盖问题当你建立了system条目后这台机器启动时Cobbler会优先匹配system条目而不是使用默认profile。如果你在system里指定了固定IP那它不会向Cobbler的DHCP动态地址池申请地址而是使用你指定的IP。这一点好处就是IP与机器身份绑定不会出现重启后地址变化的情况。如果你后来删除了某个system条目这台机器再重新安装时Cobbler就会回落到默认profile的设置也就是走DHCP动态分配。所以在管理机群时及时清理废弃的system条目和它绑定的IP很重要否则可能出现IP被旧记录占用、新机器无法使用该IP的问题。8. 网络启动安装实际跑一遍流程8.1 确保Cobbler与DHCP服务同步正常在实际启动客户端安装前先确认服务状态systemctl status httpd cobblerd xinetd dhcpd确保这四个服务都是运行状态。如果dhcpd起不来多半是之前改的dhcp.template里有语法问题可以查看/var/log/messages里的日志定位。这个坑我踩过模板里少了个分号结果DHCP服务一直起不来客户端拿不到IP开机就停在网卡引导界面不动了。8.2 客户端开机从PXE引导把测试机设为网卡引导优先开机后你会在屏幕上看到类似“Press F12 for network boot”的提示按对应按键进入网络引导。之后客户机会向Cobbler发送DHCP请求拿到IP和TFTP服务器地址再通过TFTP下载引导文件进入系统安装菜单。这时候Cobbler的菜单上会显示你配置好的profile名称如果在menu里选中对应的profile就能进入无人值守安装流程。因为ks文件已经指定了url、分区、软件包、密码等所有信息安装过程几乎不需要人工操作屏幕上的进度条一路走到安装完成最后自动重启。8.3 安装完成后的检查项系统启动后你先登录看看几个关键点ip addr hostname cat /etc/fstab分别检查IP是否是你给system指定的地址、主机名是否正确、分区是否按ks文件配置生成。再看一下/root目录下有没有安装后脚本产生的文件确认%post段是否执行成功。如果哪一步不对先检查Cobbler侧对应的配置再看ks文件有没有被正确替换变量。遇到问题别慌下面专门整理问题清单。9. 常见问题排查与避坑清单9.1 客户端无法获得IP地址先看Cobbler服务器上dhcpd服务有没有起来再查/var/log/messages。如果是dhcpd启动失败执行dhcpd -t检查配置文件语法。常见原因是/etc/cobbler/dhcp.template里的subnet参数和你服务器的网段对不上或者地址池被别人占用冲突。9.2 能拿到IP但下载不了启动文件这基本是next_server或者TFTP服务问题。先确认settings里next_server是否指向Cobbler服务器IP再确认tftp服务是否都已经启动。CentOS 7下TFTP经常挂在xinetd下你还需要确认/etc/xinetd.d/tftp中disable是否为no改完重启xinetd。9.3 启动菜单出来了但选中后安装报找不到安装源这个原因大概率是HTTP服务没有正常访问。从浏览器或者curl确认一下curl http://192.168.100.10/cobbler/ks_mirror/CentOS-7.9/如果能列出目录文件说明HTTP源没问题如果404检查distro导入时路径是否正确重新cobbler import或者用cobbler distro edit修正。9.4 能进入安装但分区报错或无法读取ks文件这里有个排查技巧按CtrlAltF2切换到安装程序的终端可以看到Anaconda的实时日志定位是哪一行配置出了问题。常见的是ks文件里写的分区条件与磁盘实际状态冲突比如clearpart --all无法清除已有RAID分区或者你指定了网卡名但实际网卡不叫eth0。9.5 ks文件中变量$tree没被替换查看生成的ks地址Cobbler在装系统时会通过HTTP返回实际渲染后的ks文件。用浏览器访问这个URL看一下$tree是否已经被替换成实际地址。如果还是原样检查profile关联的ks文件路径是否设置正确并重新执行cobbler sync。9.6 装机后没执行%post脚本检查ks文件里%post段是否放在正确位置以及脚本里写的内容是否能直接在装完的新系统上运行。比如你脚本里用了工具箱命令但新系统没装自然不会执行成功。另外%post默认在chroot环境中执行有些操作需要加--nochroot参数比如修改引导文件或固件信息。10. cobbler命令速查与Web界面10.1 常用命令速查表cobbler import --path/mnt/iso --nameCentOS-7.9 --archx86_64 cobbler distro list cobbler profile list cobbler system list cobbler profile edit --nameprofile名 --kickstart/path/xx.cfg cobbler system add --name主机名 --profileprofile名 cobbler system edit --name主机名 --interfaceeth0 --macxx --ip-addressxx cobbler sync cobbler get-loaders cobbler check记住这几个命令日常运维已经够用。查询复杂状态时用cobbler XXXX report比如cobbler system report --name机器名可以看这台机器的所有配置详情。10.2 Web界面初始化要点Cobbler自带的Web界面在安装cobbler-web后可用但默认账号密码比较特殊通常是在安装时生成的随机密码位于/etc/cobbler/modules.conf配置中。如果你很长时间没看最简单的方式是删除原有用户用htpasswd重新创建一个管理账号htpasswd -c /etc/cobbler/users.digest cobbler注意Web界面依赖Apache的CGI模块访问地址一般是http://你的IP/cobbler_web。我个人实际用得少大部分操作命令行已经够快但如果你是图形界面爱好者也可以用它在网页上完成添加系统、修改profile等操作。11. 进阶玩法与日常维护补充11.1 支持多种Linux发行版Cobbler不仅能装CentOS也支持Ubuntu/Debian、SUSE、Fedora甚至连ESXi这类虚拟化系统也能通过指定安装介质完成装机。多版本管理时建议给distro统一命名比如CentOS-7.9-x86_64、Ubuntu-22.04-x86_64、Rocky-9.2-x86_64这样在列表里一目了然。每次新导入镜像后都要检查它自动生成的profile是否使用了默认ks文件通常需要替换成你针对该系统编写的专用ks模板。11.2 维护内部软件源生产环境安装系统时如果每一步都去公共仓库拉包既慢又不可控。我建议把常用Yum源同步到Cobbler服务器上在导入系统镜像后再用reposync把需要的仓库同步到本地最后使用cobbler repo add命令把仓库关联到相应profile。这样客户端安装时软件包全部走内网速度稳定又不占用外网带宽。11.3 配合配置管理工具做初始化Cobbler的活儿在“系统装好”这一步就结束了后续的配置管理建议交给Ansible或者SaltStack。实践中我的做法是把Cobbler的%post脚本只保留最基础的配置比如设置DNS、写入内部Yum源、安装Agent和部署公钥其余复杂配置全部交给Ansible Playbook在开机后拉取执行。这样Cobbler保持轻量后续变更也不用重新刷机。11.4 快照与备份策略Cobbler的配置和数据都在/var/lib/cobbler和/var/www/cobbler目录下一个重要经验是做任何大型变更前先tar备份这两个目录。比如升级Cobbler版本或者批量修改profile之前备份后如果出问题恢复起来不用五分钟。脚本可以写成这样tar zcvf /data/backup/cobbler_backup_$(date %F).tar.gz /var/lib/cobbler /var/www/cobbler除此之外/etc/cobbler下的配置文件也要一起备份因为settings和模板信息都在这下面。CMS配置虽然不重但改来改去很容出错备份是唯一后悔药。12. 我踩过的几个坑提前替你排掉Cobbler这套东西搭建本身不复杂但很多坑藏在细节里我在实验环境里反复踩过整理几个最有代表性的。12.1 DHCP地址池与物理网段冲突最开始配置DHCP模板时我把动态地址池设置成了192.168.100.10-192.168.100.50结果Cobbler服务器自己的静态IP也在池子里。当客户端开机发起DHCP请求时DHCP服务完全有可能把Cobbler服务器自己的IP分出去造成整个服务瞬间瘫痪。正确的做法是服务器IP必须固定在地址池范围之外同时保留足够的动态地址段给临时安装的机器。12.2 SELinux没关TFTP起不来前面提过SELinux强制模式下TFTP和Cobbler的部分目录访问会被拒绝服务看起来在运行但客户端就是拉不到启动文件。关闭SELinux后问题立刻消失。虽然用规则放行是更合规的手段但对大多数中小环境来说关闭SELinux是更省事的做法前提是安全基线允许。12.3 导入镜像时路径定义不清晰我用cobbler import时name参数一开始写得很随意比如centos7、c7结果后面维护profile和system时列表里全是模糊的名字根本分不清哪个是哪个。后来我统一改成发行版-版本-架构的格式比如CentOS-7.9-x86_64既直观又方便脚本化操作。所以命名规范一定要在一开始就定好这是小习惯大收益的事情。12.4 多人共用一台Cobbler服务器不加以控制如果是团队协作环境Cobbler上可能同时存在多个人创建的profile和system没有规范时很容易互相覆盖。后来我们约定每个业务线使用独立的profile命名前缀system条目由固定人员创建并登记IP和MAC避免了大部分混乱。Cobbler本身不带细粒度权限控制所以只有靠流程约束。13. 最后的实战建议如果你打算从虚拟机实验开始练手建议准备两台虚机一台作为Cobbler服务器一台作为待装机的裸机客户端。第一次跑通从PXE引导到系统装完的完整流程后再逐步加入自定义ks、固定IP、系统初始化脚本等高级功能。我个人用了Cobbler很多年最大感受是它把“批量装系统”这件事从一门“手艺活”变成了一种“标准化流水线”。以前新机器到货我都要熬到半夜去机房一台一台装现在只需要在Cobbler里提前把profile和system建好新机器接上网线通上电就能在十分钟内变成一台IP正确、软件齐全、随时可交付的服务器。最后再分享一个小技巧每次调完Cobbler不管改了什么养成习惯跑一下cobbler check和cobbler sync确认没有明显错误再离开能帮你省掉很多半夜被叫起来的麻烦。