CentOS系统上实现yum-cron自动更新并配置邮件通知,核心操作就是安装yum-cron包、编辑配置文件设定更新策略、启用cron服务,再通过配置邮件发送让管理员及时收到更新结果。这套方案适用于CentOS 7和CentOS 8(Stream)系统,能让服务器在非业务高峰期自动打补丁,同时通过邮件把更新日志推送到运维人员邮箱,省去人工登录检查的麻烦。下面我把每一步拆开讲透,包括常见坑和进阶配置。
一、yum-cron是什么、为什么要用它
yum-cron是CentOS自带的一个定时任务工具,本质上是yum包管理器的自动化前端。它会按照你设定的时间表,自动执行yum update或yum upgrade命令,把系统安全补丁和软件更新装上。相比手动执行yum update,yum-cron的好处是:第一,不用人盯着,到点就跑;第二,可以限定只在特定时段执行,避免更新占用业务高峰期资源;第三,能把执行结果通过邮件发给你,出了问题第一时间知道。对于运维几十台甚至上百台服务器的团队来说,这是基础中的基础。
二、安装yum-cron组件
CentOS 7和CentOS 8默认都没有启用yum-cron,需要先安装。执行以下命令:
yum install -y yum-cron
安装完成后,你会在/etc/cron.daily/目录下看到一个0yum-cron.hourly的文件(不同版本路径可能略有差异),这就是yum-cron的cron入口。如果你用的是CentOS 8 Stream,包名可能叫dnf-automatic,安装命令改成:
dnf install -y dnf-automatic
但为了统一和兼容,本文以CentOS 7的yum-cron为主线来讲,CentOS 8的操作逻辑完全一致,只是把yum换成dnf即可。
三、配置yum-cron主配置文件
yum-cron的核心配置文件在/etc/yum/yum-cron.conf,这个文件决定了更新频率、更新类型、邮件发送等关键参数。用vi或nano打开它:
vi /etc/yum/yum-cron.conf
里面有几个关键字段需要你重点关注和修改:
第一个是update_cmd,默认值是security,意思是只更新安全相关的包。如果你希望全部更新,改成default:
update_cmd = default
第二个是update_messages,设为yes的话,更新完成后会生成日志消息,方便邮件通知携带详细信息:
update_messages = yes
第三个是download_updates,设为yes会先下载更新包但不安装,设为no则直接下载并安装。生产环境建议设为yes,先下载观察,确认没问题再手动触发安装,或者设为no让它全自动:
download_updates = yes
第四个是apply_updates,这个和download_updates配合使用。如果download_updates=yes,apply_updates设为no就是只下载不装;设为yes就是下载后自动安装。全自动场景下:
apply_updates = yes
第五个是random_sleep,单位是分钟,指的是在执行更新前随机等待的时间,目的是避免所有服务器同时跑更新导致源站压力过大。建议设为360(6小时)或更大:
random_sleep = 360
四、设定更新执行时间
yum-cron的执行时间由/etc/cron.d/0yum-cron.hourly这个文件控制。打开它:
vi /etc/cron.d/0yum-cron.hourly
你会看到类似这样的内容:
0 4 * * * root /usr/sbin/yum-cron
这表示每天凌晨4点执行一次yum-cron。如果你想改成每周日凌晨3点执行,就改成:
0 3 * * 0 root /usr/sbin/yum-cron
如果你想每6小时执行一次,就改成:
0 */6 * * * root /usr/sbin/yum-cron
生产环境强烈建议把执行时间设在业务低谷期,比如凌晨2点到5点之间。另外,如果你的服务器数量多,可以在不同机器上错开时间,比如机器A设2点,机器B设3点,机器C设4点,避免集中更新。
五、配置邮件通知
yum-cron默认会把更新结果通过邮件发给root用户。但root的邮件你不一定天天看,所以需要做两件事:一是确保系统能发邮件,二是把邮件转发到你的运维邮箱。
首先,确认系统安装了邮件发送工具。CentOS 7需要postfix或sendmail:
yum install -y postfix mailx
安装后启动postfix服务:
systemctl start postfix systemctl enable postfix
然后测试一下能不能发邮件:
echo "test" | mail -s "test mail" your-email@example.com
如果收不到,检查/var/log/maillog看看有没有报错,通常是postfix没有配置好relay或者DNS反向解析的问题。如果你的服务器在云上,可能还需要在云控制台开放25端口或者配置SMTP中继。
接下来,把root的邮件转发到你的运维邮箱。编辑/etc/aliases文件:
vi /etc/aliases
找到root那一行,改成你的邮箱:
root: your-email@example.com
保存后执行以下命令让别名生效:
newaliases
这样,每次yum-cron执行完,更新日志就会自动发到你的邮箱。邮件内容通常包含:更新了哪些包、有没有失败、有没有需要重启的服务等信息。
六、启用yum-cron服务
配置全部改完后,需要启用yum-cron的cron服务。CentOS 7上执行:
systemctl enable yum-cron systemctl start yum-cron
CentOS 8上如果用的是dnf-automatic:
systemctl enable dnf-automatic.timer systemctl start dnf-automatic.timer
启用后可以用以下命令确认状态:
systemctl status yum-cron
看到active (running)就说明没问题了。
七、进阶配置:排除特定包不自动更新
有些包你不希望被自动更新,比如内核包、特定版本的数据库驱动等。可以在/etc/yum/yum-cron.conf里加exclude参数,或者单独建一个exclude文件。在/etc/yum/pluginconf.d/目录下创建或编辑yum-cron.conf:
vi /etc/yum/pluginconf.d/yum-cron.conf
加入排除规则:
exclude = kernel* mysql* redis*
这样带有kernel、mysql、redis开头的包就不会被自动更新了。这个功能在生产环境非常实用,避免自动更新把关键服务搞挂。
八、手动测试和日志查看
配置完不要直接等定时任务跑,先手动触发一次看看效果:
/usr/sbin/yum-cron
执行完后查看日志,日志文件在/var/log/yum-cron.log或者/var/log/yum.log:
tail -100 /var/log/yum-cron.log
如果日志显示更新成功,邮件也收到了,说明配置没问题。如果有报错,根据错误信息排查,常见的有网络不通、源配置错误、磁盘空间不足等。
九、常见问题和避坑指南
第一个坑:磁盘空间不足。yum-cron下载更新包会占用/var/cache/yum目录的空间,如果磁盘满了更新会失败。建议定期清理旧的缓存:
yum clean all
第二个坑:更新后需要重启的服务。有些安全更新(比如glibc、openssl)装完后需要重启相关服务才生效。yum-cron本身不会自动重启,你需要在邮件里看到提示后手动处理,或者写一个post-update脚本配合cron来做。
第三个坑:邮件发不出去。很多云服务器的25端口被封了,导致postfix发不了邮件。解决办法是配置SMTP中继,比如用阿里云的企业邮箱中继或者自建SMTP服务器。在/etc/postfix/main.cf里加上:
relayhost = [smtp.example.com]:587 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
第四个坑:yum源配置问题。如果/etc/yum.repos.d/里的源已经失效或者被墙了,yum-cron自然跑不通。建议用国内镜像源,比如阿里云、腾讯云的CentOS镜像,提前测试源的连通性。
十、总结与最佳实践
CentOS yum-cron自动更新加邮件通知这套方案,本质上是用最小的配置成本实现服务器的基础自动化运维。核心步骤就五步:装包、改配置、定时间、配邮件、启服务。生产环境建议遵循以下原则:只更新安全补丁而非全量更新、错峰执行、排除关键包、监控邮件告警、定期检查日志。这套东西看着简单,但真正把它跑稳、跑可靠,是每个运维工程师的基本功。别小看自动更新这件事,多少生产事故就是因为服务器长期不打补丁、漏洞被利用造成的。把yum-cron配好,等于给服务器上了一道基本的安全防线。
