问题:如果我今天启动 server1,所有安装的软件包都将基于当前的上游版本。如果我明天启动 server2,同样,所有安装的软件包都将基于上游版本,但这次,在 server1 和 server2 之间的 24 小时内,某些软件包的上游版本可能已更改。因此,我们最终会发现 server1 和 server2 在安装的软件包版本方面不同步。
我的目标是让整个基础设施中的所有服务器都保持相同的“快照”版本,但仍支持定期安排的更新过程。
例如。server1 今天被快照。作为快照过程的一部分,我运行以下命令:
yum update --downloadonly --downloaddir=/path/to/my/repo/base/v1
yum update --enablerepo=mybaserepo
这样做的目的是根据当前上游版本 (快照) 提取所有 rpm。这样我就可以从“mybaserepo”托管 rpm,因此当我更新其他服务器时,它们可以直接从我的存储库获取 rpm,而不必担心上游 rpm 不再可用。
我原本打算实施每月升级周期,因此 v1 于 2013 年 5 月 1 日拍摄了快照,现在是 2013 年 6 月 1 日。我当时考虑的流程周期如下:
- 将所有其他服务器更新至快照版本 1
- 使用上面给出的 yum 命令将快照服务器更新到版本 2
这个循环每月重复一次。我认为这个策略解决了两个问题:
- 不断更新服务器,以确保上游补丁持续引入
- 未在快照服务器上进行首次测试(30 天)的情况下不推出新软件包版本
当然,不绝对的单一答案,因为方法有很多。我正在寻找一种普遍实施的、行业认可的做法,它可以直接解决更新服务器的问题,同时仍确保企业环境中所有服务器的版本相同。
答案1
- 创建自己的 repo(rsync 官方 centos 镜像)
- 仅当你想为所有服务器提取新更新时才更新 repo
- 仅将您的服务器指向您的本地存储库。
您可以使用 yum --downloadonly,但您仍需要创建一个存储库。如果您只是镜像现有的公共存储库并仅在需要时更新它,那么这项工作已经为您完成了。
答案2
yoonix 的答案是投资于主动更新的好方法,我们都知道这就是我们应该做事。但掌控事情的发展也是件好事实际上是。:) 我可能会推荐一个 cronjob,它可以执行类似以下代码草图(未经测试)的操作:
#!/bin/bash
email="[email protected]"
sshuser="monitoringuser"
servers=$(cat my-servers.txt)
when=$(date '+%Y%m%d-%H%M%S')
for server in servers; do
ssh $sshuser@$server 'rpm -qa |sort' > server-$server-rpmqa-$when.txt
done
diffreport=diff-rpmqa-$when.txt
diff -u server-*-rpmqa-$when.txt > $diffreport
mail -a $diffreport -s "Package diff report for $when" $email
您可以看到定期运行“rpm -Va”(可能一周一次?)并将其发送出去以检查木马、配置漂移等也很有用。
当然,这些脚本会生成只有技术含量高的人才能读懂的“报告”,所以你可以考虑使用工具。正如你现在可能预料的那样,我的公司Metafor 软件,就制作出这样的工具!:)