CentOS 7下利用YUM缓存实现Keepalived高效离线部署
1. 为什么你需要YUM缓存离线部署方案如果你是一名运维工程师或者系统管理员肯定遇到过这样的场景客户现场或者公司内部的生产环境服务器被严格限制在隔离的内网中完全无法访问互联网。这时候你需要部署像Keepalived这样的核心高可用组件却发现传统的yum install命令完全失灵。更让人头疼的是Keepalived并不是一个孤立的软件它背后依赖着一连串的库和组件比如net-snmp、lm_sensors这些。我最早遇到这个问题时也走了不少弯路。最原始的办法是找一台能上网的测试机尝试安装然后根据报错信息去网上一个个搜索缺失的依赖包手动下载RPM文件再用U盘拷到内网服务器上安装。这个过程就像玩一个永远没有尽头的“打地鼠”游戏安装A提示缺少B下载B安装又提示缺少C好不容易找到C结果C还依赖D和E……循环往复不仅效率极低而且极易出错版本兼容性问题更是让人抓狂。后来我发现CentOS的YUM工具其实自带了一个非常强大的“后悔药”功能——本地缓存。默认情况下YUM为了节省磁盘空间安装完软件后会自动清理下载的RPM包。但只要我们打开一个开关它就会把所有下载过的包包括主软件包和所有依赖包统统保留在本地的一个目录里。这不就是我们梦寐以求的“离线安装包全家桶”吗基于这个思路我总结出了一套高效、可靠的离线部署方法。它的核心思想就是在一台能联网的、环境相同的CentOS 7机器上利用YUM缓存“骗”系统完整下载一次Keepalived及其所有依赖然后我们把这个完整的“缓存目录”打包带到内网环境中就能实现一键式离线安装。这个方法完美解决了依赖地狱问题特别适合需要批量、重复部署的企业级环境。下面我就把具体的操作步骤和踩过的坑毫无保留地分享给你。2. 环境准备与YUM缓存机制深度解析工欲善其事必先利其器。在开始操作之前我们需要准备好两台机器一台可以连接互联网的“打包机”建议使用虚拟机方便重置以及最终需要部署的内网“目标机”。两台机器最好都使用相同版本的CentOS 7系统比如都是CentOS 7.6或7.9这能最大程度避免因系统小版本差异导致的库文件不兼容问题。2.1 理解YUM缓存目录结构YUM的缓存功能是其依赖解析能力的副产品。当我们执行yum install时YUM会从配置的仓库Repo中下载元数据metadata和软件包RPM。默认情况下软件包存放在/var/cache/yum/目录下。这个目录的结构是按仓库ID和系统架构组织的非常清晰。/var/cache/yum/ └── x86_64 └── 7 ├── base │ ├── packages │ └── ... ├── updates │ ├── packages │ └── ... └── epel ├── packages └── ...x86_64代表系统架构7代表CentOS主版本下面的base、updates等就是你在/etc/yum.repos.d/目录下配置的仓库ID。所有最终下载的.rpm文件都会存放在对应仓库的packages子目录下。我们的目标就是拿到这个packages目录下的所有文件。2.2 开启并验证YUM缓存在打包机上我们需要修改YUM的全局配置文件永久开启缓存功能。用你熟悉的编辑器如vi或nano打开/etc/yum.confsudo vi /etc/yum.conf找到keepcache这一行默认值是0表示不保留缓存。我们把它改成1keepcache1同时你可以关注一下cachedir这一行它定义了缓存目录的路径默认就是/var/cache/yum/$basearch/$releasever通常我们不需要修改它。保存并退出。为了确保配置生效我们可以先清理一下旧的缓存然后进行一次测试安装来触发缓存# 清理旧缓存可选确保环境干净 sudo yum clean all # 安装一个测试软件比如wget观察缓存是否生成 sudo yum install -y wget # 查看缓存目录应该能看到wget的rpm包 ls -lh /var/cache/yum/x86_64/7/base/packages/ | grep wget如果能看到wget的rpm文件说明缓存配置已经成功生效。这一步非常关键它确认了我们的基础环境是正常的为后续下载Keepalived铺平了道路。3. 实战演练生成Keepalived离线安装包环境准备好后我们就可以开始为核心目标——Keepalived——制作离线安装包了。这个过程就像是在“捕鱼”用YUM作为渔网一网打尽所有需要的“鱼”RPM包。3.1 执行在线安装以填充缓存在打包机上直接运行Keepalived的安装命令。这个命令会像往常一样从互联网仓库下载所有需要的包。sudo yum install -y keepalived安装完成后先别急着卸载。我们来看看YUM到底为我们下载了哪些宝贝。使用rpm -qa | grep keepalived可以确认Keepalived已经安装成功。但更重要的是我们去缓存目录看一看# 切换到缓存目录 cd /var/cache/yum/x86_64/7/ # 使用find命令查找所有下载的rpm包并列出详细信息 find . -name *.rpm -type f | xargs ls -lh你会看到类似下面的输出里面不仅包含了keepalived-1.3.5-19.el7.x86_64.rpm还包含了它依赖的net-snmp-agent-libs、net-snmp-libs、lm_sensors-libs等包。这些就是我们需要收集的全部文件。-rw-r--r--. 1 root root 332K Apr 10 12:00 ./base/packages/keepalived-1.3.5-19.el7.x86_64.rpm -rw-r--r--. 1 root root 707K Apr 10 12:00 ./updates/packages/net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm -rw-r--r--. 1 root root 752K Apr 10 12:00 ./updates/packages/net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm -rw-r--r--. 1 root root 42K Apr 10 12:00 ./base/packages/lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm这里有一个非常重要的经验点不同时期的CentOS 7其updates仓库的版本可能不同。例如你的打包机如果更新比较频繁下载的net-snmp库版本可能是5.7.2-49.el7_9.2而一个刚安装的、版本较旧的目标机其本地仓库信息可能还停留在更早的版本。如果你只拷贝了高版本的包在低版本系统上安装时YUM或RPM可能会因为版本过高而报错。因此确保打包机和目标机的基础系统版本尽可能一致是成功的关键。3.2 收集与整理离线包现在我们需要把这些散落在各个仓库packages目录下的RPM包集中收集到一个单独的目录中方便我们打包带走。# 创建一个专门存放离线包的目录 mkdir -p ~/keepalived-offline-packages # 使用find和cp命令复制所有rpm包到新目录 find /var/cache/yum -name *.rpm -type f -exec cp {} ~/keepalived-offline-packages/ \; # 查看收集到的包 ls -lh ~/keepalived-offline-packages/ | wc -l ls -lh ~/keepalived-offline-packages/wc -l命令可以告诉你一共收集到了多少个RPM包通常除了Keepalived本身还会有3-5个依赖包。你可以将这些文件打包成一个压缩包tar -czf keepalived-offline.tar.gz -C ~/keepalived-offline-packages .这个keepalived-offline.tar.gz文件就是我们的“离线安装神器”。你可以把它拷贝到U盘或者通过企业内部的文件服务器传输到内网的目标机器上。4. 内网目标机上的高效离线安装拿到离线安装包我们来到最终战场——那台无法连接外网的目标服务器。这里的操作核心是绕过YUM的仓库依赖检查直接使用RPM命令进行本地安装。4.1 上传与准备安装包首先将打包好的keepalived-offline.tar.gz上传到目标服务器的一个目录比如/usr/local/src/。然后解压# 切换到目标目录 cd /usr/local/src/ # 上传你的压缩包假设通过scp或物理介质 # 解压 tar -xzf keepalived-offline.tar.gz # 进入解压后的目录 cd keepalived-offline-packages/现在你的当前目录下应该躺着所有必需的RPM文件。在安装前我强烈建议你先检查一下目标机是否已经安装了任何可能冲突的旧版本Keepalivedrpm -qa | grep keepalived如果已经有安装你可能需要先卸载它rpm -e keepalived但请注意在生产环境操作需谨慎。4.2 使用RPM命令强制安装所有依赖这是最关键的一步。我们将使用rpm命令的-Uvh升级或安装参数配合两个非常重要的选项--nodeps和--force。sudo rpm -Uvh *.rpm --nodeps --force让我解释一下这几个参数-Uvh: U代表升级或安装v显示详细信息h显示进度条。*.rpm: 通配符表示安装当前目录下所有的rpm包。--nodeps:忽略依赖检查。这是离线安装的灵魂。因为我们已经在同一个目录下提供了所有必需的包所以可以放心地让RPM跳过复杂的依赖关系验证直接安装。--force:强制安装。这个参数会覆盖文件冲突、重复安装等问题。在离线环境下它能解决大部分因环境细微差异导致的安装失败。执行命令后你会看到屏幕上快速滚过安装进度最后显示“Complete!”。整个过程通常在几秒钟内完成比你想象的要快得多。4.3 验证安装与服务启动安装完成不代表万事大吉我们必须进行验证。# 1. 再次检查Keepalived软件包是否已安装 rpm -qa | grep keepalived # 2. 检查Keepalived二进制文件是否存在 which keepalived ls -lh /usr/sbin/keepalived # 3. 检查服务状态此时服务应该是未启动的 sudo systemctl status keepalived # 4. 尝试启动服务 sudo systemctl start keepalived # 5. 查看启动后的状态 sudo systemctl status keepalived如果一切顺利systemctl status命令会显示active (running)并且会打印出Keepalived进程的PID。你还可以通过查看日志来确认sudo journalctl -u keepalived -f --since 1 minute ago最后别忘了设置开机自启这对于高可用服务至关重要sudo systemctl enable keepalived5. 进阶技巧与避坑指南掌握了基本流程后我们再来聊聊一些能让你事半功倍的进阶技巧以及我踩过的一些坑。5.1 使用yumdownloader进行更精准的下载前面我们通过修改yum.conf来开启全局缓存。但有时你可能只想下载某个特定的软件包及其依赖而不想真的安装它。这时yum-utils工具包里的yumdownloader命令就派上用场了。首先在打包机上安装这个工具sudo yum install -y yum-utils然后使用--downloadonly和--downloaddir参数来指定只下载不安装并指定下载目录sudo yum install -y keepalived --downloadonly --downloaddir/path/to/your/download这个方法更干净目的性更强。但根据我的经验它有时可能不会像开启全局缓存那样捕获到某些更深层次的间接依赖。两种方法可以结合使用互为补充。5.2 处理“依赖的依赖”与版本冲突这是离线部署中最常见的问题。你可能发现从打包机拷贝的包在目标机上安装时仍然提示缺少某个库文件比如libmysqlclient.so.18。这通常是因为你的打包机在安装Keepalived时系统里已经存在某些基础库比如从其他渠道安装的MySQL开发库所以YUM没有去下载这些依赖。但目标机是一个纯净的系统就缺失了。解决方案在打包机上模拟最小化安装最好使用一个全新的、最小化安装的CentOS 7虚拟机作为打包机这样它缺失的依赖目标机大概率也会缺失能最大程度保证依赖包的完整性。手动补充缺失包如果还是缺少你需要根据报错信息在另一台能上网的机器上使用yum provides */libmysqlclient.so.18这样的命令查找是哪个RPM包提供了这个文件然后单独下载这个包加入你的离线包集合。创建本地YUM仓库高级对于需要批量部署多台内网服务器的情况更专业的做法是在内网搭建一个本地YUM仓库。将收集的所有RPM包放入一个目录使用createrepo命令生成仓库元数据。然后在目标机上将/etc/yum.repos.d/中的源指向这个本地仓库路径。这样在内网就可以继续使用yum install keepalived命令享受自动依赖解析的便利。这算是离线部署的“终极形态”。5.3 批量部署与自动化脚本如果你需要在内网的几十上百台服务器上部署Keepalived手动上传、解压、运行命令显然不现实。这时可以编写一个简单的Shell脚本来自动化这个过程。#!/bin/bash # deploy_keepalived_offline.sh OFFLINE_PKG_DIR/usr/local/src/keepalived-offline-packages SERVICE_NAMEkeepalived echo 开始离线部署Keepalived... # 1. 检查安装包目录是否存在 if [ ! -d $OFFLINE_PKG_DIR ]; then echo 错误离线包目录 $OFFLINE_PKG_DIR 不存在 exit 1 fi # 2. 进入目录并安装 cd $OFFLINE_PKG_DIR || exit echo 正在安装RPM包... if rpm -Uvh *.rpm --nodeps --force; then echo RPM包安装成功。 else echo RPM包安装失败请检查。 exit 1 fi # 3. 启动并设置开机自启 echo 配置Keepalived服务... systemctl daemon-reload if systemctl start $SERVICE_NAME; then echo 服务启动成功。 systemctl enable $SERVICE_NAME /dev/null 21 echo 已设置开机自启。 else echo 服务启动失败请检查配置。 systemctl status $SERVICE_NAME exit 1 fi # 4. 最终状态检查 echo 最终服务状态 systemctl is-active $SERVICE_NAME echo 部署完成你可以将这个脚本和离线包一起分发然后在每台目标机上执行即可。通过Ansible、SaltStack等自动化运维工具来批量执行此脚本效率会更高。6. 方法延伸搞定Nginx及其他软件的离线部署掌握了Keepalived的离线部署方法你就掌握了一把万能钥匙。这套基于YUM缓存的思路几乎适用于所有通过YUM仓库分发的CentOS/RHEL系软件比如Nginx、HAProxy、MySQL、Redis等等。以Nginx为例流程完全一样在打包机上开启YUM缓存 (keepcache1)。执行sudo yum install -y nginx。从/var/cache/yum/.../packages/目录收集所有Nginx及其依赖的RPM包。打包传到内网目标机。使用sudo rpm -Uvh *.rpm --nodeps --force安装。我亲自用这个方法部署过内网的Nginx集群同样高效。它把复杂的依赖管理问题提前在可联网的环境中一次性解决将离线部署的复杂度降到了最低。当然每款软件的依赖树不同可能遇到的特殊问题也不同。比如某些软件可能需要额外的仓库如EPEL你在打包机上就需要提前配置好这些仓库确保下载的依赖包完整。最后我想说技术方案没有绝对的好坏只有适合与否。这种YUM缓存离线法在需要快速部署、环境相对标准化的场景下优势非常明显。但它也要求你对操作系统的包管理有基本的了解。希望这篇结合了我大量实战经验的分享能帮你彻底摆脱内网部署的烦恼让Keepalived的安装变得像在公网一样简单顺畅。如果在实际操作中遇到新的问题不妨回头看看“进阶技巧与避坑指南”那部分大多数难题都能在那里找到思路。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410999.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!