有没有一些简单直接的方法可以让几台 Linux 机器保持相同的补丁级别?我需要分别针对几台 Ubuntu 和几台 CentOS 7(实际上是 Oracle Linux 7,但足够接近,因为其他人可能更熟悉 CentOS)机器进行此操作。
编辑:只是为了澄清,不同的发行版不必“处于同一补丁级别”,所以我只需要保持例如 Ubuntu 16.xx 机器处于同一补丁级别,Ubuntu 18.xx 机器处于同一补丁级别,Oracle Linux 7.x 机器处于同一补丁级别等。
我的意思是这样的。我有一台 CentOS 7 机器 A,我用“sudo yum update”更新它。它有默认存储库以及一些额外的第三方存储库。然后一个月后,我想更新另一台 CentOS 7 机器,但不是更新到最新的软件包,而是更新到与机器 A 相同的版本。
如果安装的存储库和软件包存在差异(例如机器 A 有一个纱和詹金斯如果 B 安装了存储库和软件包,而 B 没有,反之亦然,则这些软件包将不计算在内,但会更新为任一计算机上可用的最新版本。因此,只有两台计算机上都存在的软件包才会受到“版本限制”。
我知道至少在 CentOS 中(百胜)你可以将软件包更新到某个版本,而不是最新版本,我认为也可以通过易于在 Ubuntu 上。问题是,是否有一个适用于 Ubuntu 和 CentOS 的工具,可以使用第一台机器的输出(安装了哪些软件包以及它们的版本)作为第二台机器的输入,将其更新到哪个版本,如果该软件包(和存储库)也安装在那里。然后其余部分将更新为最新版本。
我之前曾尝试用 Google 搜索此问题,主要看到两条建议:
设置本地存储库。我实际上已经这样做了,但它看起来太庞大和笨拙了,只是为了让我能将几台机器保持在相同的补丁级别。如果有几十台或几百台机器需要更新并保持在相同的补丁级别,那么这样做更有意义(此时也可以使用Ansible或者其他的东西)。
使用具有特定补丁级别的安装媒体 CD,然后从那里安装更新。我不太清楚这是如何工作的,但主要是,这些媒体 CD 不是只包含官方发行版存储库吗?那么后来在机器上添加的第三方存储库呢,比如 Jenkins,GitLab 持续集成、Chrome、epel 还有什么?
答案1
有一种更简单的方法可以做到这一点,那就是使用包锁文件。 yum 版本锁定应该允许您在机器 A 上创建一个参考锁文件,然后您可以手动或使用 Ansible 将其复制到其他 centOS 7 机器。
如果您只关心几个软件包,那么使用 Ansible 管理它们会更容易。如果您确实需要所有软件包在不同的机器上保持完全相同的版本,那么 yum-versionlock 是最佳选择。您仍然可以使用 Ansible 从机器 A 复制锁定文件。
安装 yum-versionlock
[centos@ec2]$ sudo yum -y install yum-versionlock
然后添加所有包*
或特定包,例如httpd
[centos@ec2]$ sudo versionlock add *
您应该会在文件中看到这些包,versionlock.list
如 中指定的那样versionlock.conf
。默认情况下,这些文件位于/etc/yum/pluginconfg.d/
[centos@ec2]$ cat /etc/yum/pluginconf.d/versionlock.conf
[main]
enabled = 1
locklist = /etc/yum/pluginconf.d/versionlock.list
# Show a hint when any locked packages have updates available
show_hint = 1
# Uncomment this to lock out "upgrade via. obsoletes" etc. (slower)
# follow_obsoletes = 1
[centos@ec2]$ cat /etc/yum/pluginconf.d/versionlock.list
# Added locks on Mon Jun 22 20:05:02 2020
0:libverto-libevent-0.2.5-4.el7.*
0:nss-sysinit-3.44.0-7.el7_7.*
10:qemu-guest-agent-2.12.0-3.el7.*
1:wpa_supplicant-2.6-12.el7.*
2:shadow-utils-4.6-5.el7.*
0:libgcrypt-1.5.3-14.el7.*
0:rsyslog-8.24.0-41.el7_7.2.*
0:gettext-libs-0.19.8.1-2.el7.*
...
然后复制versionlock.list
到另一台机器并运行sudo yum install -y
或sudo yum update -y
,它将安装或更新所有软件包到锁定文件中的版本。如果你只是运行更新,它应该只会将你已经拥有的更新到锁定文件允许的版本(但我还没有尝试过)。
对于其他操作系统也有类似的工具,例如此处解释 apt,但我不知道有哪个工具可以跨不同的包管理器锁定包。
如果你只关心一些包,你可以使用 Ansible 的封装模块执行此操作,但您可能会发现某些用例必须使用 yum 和其他包管理器特定模块。这可能会变得混乱,但值得。
如果您确实需要一个单一工具,那么您可以使用 Ansible 从您需要支持的不同包管理器中的 jinja2 模板创建包锁定文件,然后将它们复制到您的机器上。这将需要更长的设置时间并且容易出错,但可以让您维护要安装的单个包列表。