一键适配)
Shell 脚本自动化配置 YUM 源3 种系统版本CentOS 5.9/6.8/7.6一键适配实战指南在 Linux 系统管理中YUM 源配置是每位运维工程师的必修课。面对不同版本的 CentOS 系统手动逐个配置不仅效率低下还容易出错。本文将带你开发一个智能化的 Shell 脚本实现 CentOS 5.9、6.8 和 7.6 三个版本的 YUM 源自动适配大幅提升运维效率。1. 理解 YUM 源配置的核心要素YUMYellowdog Updater Modified是 CentOS/RHEL 系统中强大的包管理工具其核心配置文件位于/etc/yum.repos.d/目录下。不同版本的 CentOS 系统对 YUM 源配置有着细微但关键的差异版本标识差异CentOS 5.x 使用$releasever变量与 6.x/7.x 的解析方式不同GPG 密钥路径各版本系统的 RPM-GPG-KEY 文件路径和命名存在差异仓库结构官方源和第三方源的目录结构随版本变化典型问题场景当我们在 CentOS 7 服务器上直接使用为 CentOS 6 设计的 repo 文件时经常会遇到 Cannot find a valid baseurl for repo 等错误。这正是因为$releasever变量在不同版本中的解析结果不同导致的。2. 环境检测与版本识别精准识别系统版本是我们脚本的第一步也是整个自动化流程的基础。我们通过解析/etc/redhat-release文件来获取精确版本信息#!/bin/bash # 获取系统主版本号 (5/6/7) MAJOR_VERSION$(cat /etc/redhat-release | awk {print $4} | awk -F. {print $1}) # 获取完整版本号 (如 6.8) FULL_VERSION$(cat /etc/redhat-release | awk {print $4} | awk -F. {print $1.$2}) # 验证版本号有效性 if ! [[ $FULL_VERSION ~ ^(5\.9|6\.8|7\.6)$ ]]; then echo 错误本脚本仅支持 CentOS 5.9/6.8/7.6 exit 1 fi提示在生产环境中建议添加对/etc/redhat-release文件存在性的检查并考虑使用lsb_release -a作为备选方案。3. 安全备份机制实现在修改任何系统配置前完善的备份机制是必不可少的。我们的脚本采用以下备份策略创建带时间戳的备份目录保留原始文件权限记录备份日志以便追溯BACKUP_DIR/etc/yum.repos.d/backup_$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR chmod 700 $BACKUP_DIR # 确保备份目录权限安全 # 备份现有repo文件并记录日志 echo $(date) - 开始备份现有YUM配置 /var/log/yum_config.log find /etc/yum.repos.d/ -name *.repo -exec cp -a {} $BACKUP_DIR/ \; echo 原始配置已备份至 $BACKUP_DIR | tee -a /var/log/yum_config.log # 清空现有配置保留备份目录 find /etc/yum.repos.d/ -name *.repo -exec rm -f {} \;备份目录结构示例/etc/yum.repos.d/backup_20230815_143022/ ├── CentOS-Base.repo ├── epel.repo └── backup.log4. 多版本条件判断与配置我们使用case语句实现版本分支处理相比if-elif结构更清晰易维护。每种版本配置包含以下要素基础仓库配置更新仓库配置EPEL 仓库配置必要的 GPG 密钥验证case $FULL_VERSION in 5.9) echo 配置 CentOS 5.9 YUM 源 | tee -a /var/log/yum_config.log cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-5.9 - Base baseurlhttp://vault.centos.org/5.9/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 [updates] nameCentOS-5.9 - Updates baseurlhttp://vault.centos.org/5.9/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 EOF ;; 6.8) echo 配置 CentOS 6.8 YUM 源 | tee -a /var/log/yum_config.log cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-6.8 - Base baseurlhttp://vault.centos.org/6.8/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 [updates] nameCentOS-6.8 - Updates baseurlhttp://vault.centos.org/6.8/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 EOF ;; 7.6) echo 配置 CentOS 7.6 YUM 源 | tee -a /var/log/yum_config.log cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-7.6 - Base baseurlhttp://vault.centos.org/7.6.1810/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [updates] nameCentOS-7.6 - Updates baseurlhttp://vault.centos.org/7.6.1810/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 EOF ;; esac5. 增强功能实现基础功能完成后我们添加以下增强特性提升脚本的健壮性5.1 网络连通性检测check_network() { local TEST_URLhttp://vault.centos.org if curl --output /dev/null --silent --head --fail $TEST_URL; then return 0 else echo 网络连接失败请检查网络配置 | tee -a /var/log/yum_config.log return 1 fi } # 在执行配置前检查网络 if ! check_network; then exit 1 fi5.2 缓存清理与重建clean_yum_cache() { echo 清理YUM缓存... | tee -a /var/log/yum_config.log yum clean all /dev/null 21 rm -rf /var/cache/yum/* } rebuild_yum_cache() { echo 重建YUM缓存... | tee -a /var/log/yum_config.log yum makecache /dev/null 21 if [ $? -ne 0 ]; then echo 错误YUM缓存重建失败 | tee -a /var/log/yum_config.log return 1 fi return 0 }5.3 配置验证测试verify_config() { echo 验证YUM配置... | tee -a /var/log/yum_config.log if ! yum repolist /dev/null 21; then echo 错误YUM配置验证失败 | tee -a /var/log/yum_config.log return 1 fi REPO_COUNT$(yum repolist enabled | grep -c repo id) if [ $REPO_COUNT -lt 1 ]; then echo 错误未启用任何YUM仓库 | tee -a /var/log/yum_config.log return 1 fi echo YUM配置验证通过共启用 $REPO_COUNT 个仓库 | tee -a /var/log/yum_config.log return 0 }6. 完整脚本整合将上述模块整合为完整脚本添加执行权限后即可使用#!/bin/bash # CentOS多版本YUM源自动配置脚本 # 支持版本CentOS 5.9/6.8/7.6 # 初始化日志 LOG_FILE/var/log/yum_config.log mkdir -p $(dirname $LOG_FILE) echo $(date) - 脚本开始执行 $LOG_FILE # 定义颜色输出 RED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m NC\033[0m # No Color # 检查root权限 if [ $(id -u) -ne 0 ]; then echo -e ${RED}错误本脚本需要root权限执行${NC} | tee -a $LOG_FILE exit 1 fi # 获取系统版本 if [ ! -f /etc/redhat-release ]; then echo -e ${RED}错误非CentOS/RHEL系统${NC} | tee -a $LOG_FILE exit 1 fi FULL_VERSION$(cat /etc/redhat-release | awk {print $4} | awk -F. {print $1.$2}) MAJOR_VERSION$(echo $FULL_VERSION | awk -F. {print $1}) # 版本验证 if ! [[ $FULL_VERSION ~ ^(5\.9|6\.8|7\.6)$ ]]; then echo -e ${RED}错误本脚本仅支持 CentOS 5.9/6.8/7.6${NC} | tee -a $LOG_FILE exit 1 fi # 网络检测 check_network() { local TEST_URLhttp://vault.centos.org if curl --output /dev/null --silent --head --fail $TEST_URL; then return 0 else echo -e ${YELLOW}警告无法连接到CentOS仓库请检查网络${NC} | tee -a $LOG_FILE return 1 fi } # 备份原有配置 backup_config() { local BACKUP_DIR/etc/yum.repos.d/backup_$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR chmod 700 $BACKUP_DIR echo 备份原有配置到 $BACKUP_DIR | tee -a $LOG_FILE find /etc/yum.repos.d/ -maxdepth 1 -name *.repo -exec cp -a {} $BACKUP_DIR/ \; # 清空现有配置 find /etc/yum.repos.d/ -maxdepth 1 -name *.repo -exec rm -f {} \; } # 配置CentOS仓库 configure_repo() { case $FULL_VERSION in 5.9) echo 配置CentOS 5.9仓库 | tee -a $LOG_FILE cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-5.9 - Base baseurlhttp://vault.centos.org/5.9/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 enabled1 [updates] nameCentOS-5.9 - Updates baseurlhttp://vault.centos.org/5.9/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 enabled1 EOF ;; 6.8) echo 配置CentOS 6.8仓库 | tee -a $LOG_FILE cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-6.8 - Base baseurlhttp://vault.centos.org/6.8/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 enabled1 [updates] nameCentOS-6.8 - Updates baseurlhttp://vault.centos.org/6.8/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 enabled1 EOF ;; 7.6) echo 配置CentOS 7.6仓库 | tee -a $LOG_FILE cat /etc/yum.repos.d/CentOS-Base.repo -EOF [base] nameCentOS-7.6 - Base baseurlhttp://vault.centos.org/7.6.1810/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled1 [updates] nameCentOS-7.6 - Updates baseurlhttp://vault.centos.org/7.6.1810/updates/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled1 EOF ;; esac } # 清理和重建缓存 refresh_cache() { echo 清理YUM缓存... | tee -a $LOG_FILE yum clean all /dev/null 21 echo 重建YUM缓存... | tee -a $LOG_FILE if ! yum makecache /dev/null 21; then echo -e ${RED}错误YUM缓存重建失败${NC} | tee -a $LOG_FILE return 1 fi return 0 } # 验证配置 verify_config() { echo 验证YUM配置... | tee -a $LOG_FILE if ! yum repolist /dev/null 21; then echo -e ${RED}错误YUM配置验证失败${NC} | tee -a $LOG_FILE return 1 fi REPO_COUNT$(yum repolist enabled | grep -c repo id) if [ $REPO_COUNT -lt 1 ]; then echo -e ${RED}错误未启用任何YUM仓库${NC} | tee -a $LOG_FILE return 1 fi echo -e ${GREEN}YUM配置验证通过共启用 $REPO_COUNT 个仓库${NC} | tee -a $LOG_FILE return 0 } # 主执行流程 if ! check_network; then exit 1 fi backup_config configure_repo if ! refresh_cache; then exit 1 fi if ! verify_config; then exit 1 fi echo -e ${GREEN}YUM配置完成脚本执行成功${NC} | tee -a $LOG_FILE exit 07. 生产环境优化建议在实际生产环境中部署时建议考虑以下优化企业内网镜像源将vault.centos.org替换为企业内部的镜像服务器地址代理支持添加proxy配置项以支持通过代理访问定时任务设置定期缓存更新任务邮件通知关键操作结果通过邮件通知管理员扩展性设计使用函数库方式组织代码便于添加新版本支持# 示例添加企业内网镜像源配置 INTERNAL_MIRRORhttp://yum.internal.example.com/centos/\$releasever # 在configure_repo函数中替换baseurl baseurl${INTERNAL_MIRROR}/os/\$basearch/通过这个脚本我们实现了 CentOS 多版本 YUM 源的一键自动化配置将原本需要 10-15 分钟的手动操作缩短到 10 秒内完成同时大幅降低了人为错误的风险。