CentOS 8 中的无人值守自动更新

CentOS 无疑是使用最广泛的 Linux 发行版之一,主要用于 Linux 服务器。 它是一个免费的、社区支持的 Red Hat Enterprise Linux (RHEL) 分支,它提供了一个稳定且经过微调的操作系统。

最新版本 CentOS 8 引入了一个名为 DNF 的新软件包管理器,即 Dandified YUM(Yellowdog Updater,Modified)。 YUM 是所有 CentOS 版本的默认包管理器。 正因为如此,更新过程并没有太大变化,并且继续简单明了。 问题是当我们有几个 CentOS 实例时。 最好寻找替代方案来自动化该过程。 这就是我们将在本文中介绍的内容。

在开始自动化之前,有必要解决我们如何手动检查 CentOS 的升级、应用它们、维护我们的系统、排除特定软件包以及一些提示和技巧。

如何检查更新

CentOS 8 支持 dnf 和 yum,因此我们将介绍这两种包管理器,并按此顺序显示后续代码块。

一些实用程序可以帮助提高系统的速度和性能,并在安装更新时扩展包管理器的使用。 dnf 和 yum 的推荐插件如下。

dnf:

  • python3-dnf-plugin-versionlock
  • epel-释放
  • dnf插件核心
  • dnf-自动

百胜:

  • 百胜插件版本锁
  • epel-释放
  • 百胜工具
  • 百胜
  • yum-plugin-fastestmirror

为确保已安装这些,我们将需要运行此命令(取决于您选择的包管理器)。

dnf install python3-dnf-plugin-versionlock epel-release dnf-plugins-core dnf-automatic
yum install yum-plugin-versionlock epel-release yum-utils yum-cron yum-plugin-fastestmirror

要在 dnf 上启用最快的镜像(如果使用 yum,安装 yum-plugin-fastestmirror 就可以了),我们需要编辑其配置文件(位于 /etc/dnf/dnf.conf)并在下面添加以下行 [main] 部分。

sudo vi /etc/dnf/dnf.conf 
[main]
...
skip_if_unavailable=True
fastestmirror=1

添加后,最好在检查更新之前从启用的存储库中清除所有累积的缓存数据。

dnf clean all
yum clean all

注意:清理不会影响已安装的软件包。

现在让我们验证哪些更新可用。

LiquidWeb # dnf check-update
NetworkManager.x86_64               1:1.26.0-12.el8_3              BaseOS
NetworkManager-libnm.x86_64         1:1.26.0-12.el8_3              BaseOS
NetworkManager-team.x86_64          1:1.26.0-12.el8_3              BaseOS
NetworkManager-tui.x86_64           1:1.26.0-12.el8_3              BaseOS
authselect.x86_64                   1.2.1-2.el8                    BaseOS
authselect-libs.x86_64              1.2.1-2.el8                    BaseOS
bash.x86_64                         4.4.19-12.el8                  BaseOS
bind-export-libs.x86_64             32:9.11.20-5.el8_3.1           BaseOS
...
LiquidWeb # yum check-updates
176 packages excluded due to repository priority protections
LiquidWeb #

手动更新包

在本节中,我们将讨论特定的包更新。

1. 一般更新

要将所有软件包更新到最新版本,请使用以下命令。

dnf update
yum update

此命令将更新整个 CentOS 系统,包括过时的软件包、内核和任何过时的系统实用程序,以确保系统是最新的。

2. 仅安全更新

另一个有趣的用例是我们只需要维护最新的安全补丁。 对于 yum,插件 yum-security 将完成该任务,而无需触及其余已安装的软件包。 由于它是从 CentOS 7 开始集成的,我们只需要使用命令即可。

LiquidWeb # dnf upgrade --security
No security updates needed, but 15 updates available
Dependencies resolved.
Nothing to do.
Complete!
LiquidWeb # yum update --security
No security updates needed, but 207 updates available
Dependencies resolved.
Nothing to do.
Complete!

3. 不包括包裹

在某些情况下,我们可能希望让某个软件在特定版本上运行。 假设我们将 MariaDB 作为我们的数据库管理系统,并且我们的站点和应用程序在 10.1.12 版本中运行良好。 如果自动升级最终破坏了所有站点,那将是一种不良情况。 为了避免这种情况,我们可以使用我们之前为 dnf 和 yum 安装的 versionlock 插件。 以下是将包锁定到特定版本的命令。

LiquidWeb # dnf versionlock add mariadb
Adding versionlock on: mariadb-10.1.12.el7*
LiquidWeb # yum versionlock add mariadb
Loaded plugins: fastestmirror, priorities, universal-hooks, versionlock
Adding versionlock on: 0:mariadb-10.1.12.el7
versionlock added: 1

此操作将创建一个包含所有自定义块的文件(/etc/dnf/plugins/versionlock.list 或 /etc/yum/pluginconf.d/versionlock.list)。 或者,我们可以使用 -x 标签从更新命令中排除某些包。

dnf -x mariadb update
yum -x mariadb update

4. 排除内核更新

如果我们的环境对突然变化很敏感,我们可以排除重要的内核更新以保持稳定。 与上一节一样,我们将使用 -x 标记。

dnf update -x kernel -x redhat-release*
yum update -x kernel -x redhat-release*

为了使更改永久生效,我们可以直接修改配置文件(总是在 [main] 部分)。

sudo vi /etc/dnf/dnf. conf 
[main]
...
# Excluded packages
exclude=kernel, redhat-release*
sudo vi /etc/yum.conf
[main]
...
# Excluded packages
exclude = kernel, redhat-release*

自动化升级过程

现在我们知道如何手动更新我们的系统,让我们开始玩吧。 我们将讨论两个主要工具:dnf-automatic 或 yum-cron 以及 cron 实用程序。 我们将展示一些关于使用这些工具自动化更新过程和设置自定义配置的想法。

1. 包管理器实用程序

Dnf-automatic 和 yum-cron 是与调度实用程序 cron 非常相似的服务。 但是,这些插件已针对升级每天运行的任务进行了优化。 充分利用插件的推荐方法是详细探索配置文件以确定最合适的选项。

有几个设置需要调整:

  • 我们要执行的更新类型。
  • 如果我们想下载或安装升级,我们应该如何处理通知。

我们甚至可以将软件包排除在更新之外。 我们之前安装了插件,所以现在我们必须启用它们。

LiquidWeb # systemctl enable --now dnf-automatic.timer
Created symlink /etc/systemd/system/timers.target.wants/dnf-automatic.timer → /usr/lib/systemd/system/dnf-automatic.timer.
LiquidWeb # systemctl enable yum-cron
LiquidWeb # systemctl start yum-cron
LiquidWeb # systemctl status yum-cron
● yum-cron.service - Run automatic yum updates as a cron job
   Loaded: loaded (/usr/lib/systemd/system/yum-cron.service; enabled; vendor preset: disabled)
   Active: active (exited) 
 Main PID: 44673 (code=exited, status=0/SUCCESS)

现在服务已启用,我们可以自由地自定义和设置我们认为合适的服务。 配置文件是 /etc/dnf/automatic.conf 和 /etc/yum/yum-cron.conf。

以下是一些最重要的指令。

[commands]
...
upgrade_type = default
download_updates = yes
apply_updates = no

[emitters]
...
emit_via = email

[email]
...
email_from = root@localhost
email_to = [email protected]

[base]
...
debuglevel = 1
exclude = mariadb*

从 [commands] 部分,我们可以突出显示这三个命令:

  • upgrade_type:确定我们要执行的升级类型(默认、安全、最小)。
  • download_updates:下载更新文件。
  • apply_updates:安装下载的文件。

在里面 [emitters] 部分,选项 emit_via 让我们设置我们希望如何获取通知(stdio、电子邮件或 motd)。 本节与 [email] 部分以建立邮件设置。

最后,我们有 [base] 部分。 它允许我们覆盖主要的 dnf.conf 或 yum.conf 文件(配置文件)。 这里可以设置几个选项,包括调试级别、排除规则和自定义命令。

2. Cron 作业

我们可以使用命令 crontab -e 来自动化服务器脚本。 该命令允许我们打开 cron 作业文件并添加计划任务。 下面列出了一些最常见的计划任务。

0 0 * * * /usr/bin/dnf update # Daily full updates 
0 0 * * * /usr/bin/dnf update --security # Daily security updates 
0 0 * * * /usr/bin/dnf -x mariadb update # Daily updates excluding a single package 

0 0 * * * /usr/bin/dnf update -x kernel -x redhat-release* # Daily executions excluding kernel updates
0 0 1 * * /usr/bin/dnf update kernel* redhat-release* # To use along the previous job, updates the kernel each 1st day of the month
0 0 * * * /usr/bin/yum update # Daily full updates 
0 0 * * * /usr/bin/yum update --security # Daily security updates 
0 0 * * * /usr/bin/yum -x mariadb update # Daily updates excluding a single package 

0 0 * * * /usr/bin/yum update -x kernel -x redhat-release* # Daily executions excluding kernel updates
0 0 1 * * /usr/bin/yum update kernel* redhat-release* # To use along the previous job, updates the kernel each 1st day of the month

结论

Unix/Linux 系统为用户提供了极大的灵活性,CentOS 也不例外。 初始配置可能需要一段时间,但一旦正确设置,您的系统将达到满足您特定需求的速度,并且只会更新需要更新的内容。

有额外的网站需求? 探索 Liquid Web 的托管插件,以帮助提高您的网站存储、安全性和性能。