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配好,等于给服务器上了一道基本的安全防线。