我有两本关于 Puppet 的书,但没有一本提到如何推动yum update
或aptitude safe-upgrade
。
所以我的印象是 Puppet 做不到,这让我很难相信。
问题
您每月将如何在多个不同的主机上推广yum update
?aptitude safe-upgrade
答案1
Puppet 实际上只是一个配置管理实用程序,而不是自动化工具。如果您想要真正的自动化,那么您会想要了解 mcollective,它最初是一个第三方工具,现在已被纳入 puppetlabs 的保护范围。我没有使用过 mcollective,所以我真的无法说它处理这个问题有多好,但我的理解是它最适合用作任意任务执行机制,当尝试执行定期重复的任务时,它的效果就不好了。
我认为最好的方法是开发要更新的脚本和流程,然后使用 puppet 推送配置。所以问自己以下问题。
- 我希望机器多久更新一次?
- 我是否希望它们在安装新内核时自动重新启动,还是只想要一个通知?
- 我们是否应该在更新期间运行任何特殊命令?
- 我是否拥有足够多的系统以致于更新应该错开?
当您开始构建配置并回答这些问题时,您可能会发现更多来自特定环境的问题。对于一个具体的例子,我这样做是这样的:
- 对于我的大多数系统,更新都是每周一次,通过 cron 作业进行。根据目的和环境,某些系统更新的频率要高得多。
- 大多数系统会自动重启,某些系统(视用途而定)会通过电子邮件发送重启提醒。这是通过 cron 作业处理的,该作业会根据以下输出检查版本号最高的 vmlinuz
/boot
文件uname -r
- 在 RHEL 5.3->5.4 的 glibc 更新造成困扰后,我确保先更新 yum,然后更新 glibc,然后再更新其他所有内容。
- 由于所有这些都是由 cron 作业运行的,因此我在每次 yum 运行之间随机设置休眠时间。每个主机可能需要 5 分钟到 45 分钟才能完成,这可以合理地分散负载。
这些都包含在两个文件中,两个 cron 条目(更新和内核检查)存储在/etc/cron.d
更新脚本中。我使用一个看起来越来越混乱的 shell 脚本来执行此操作,该脚本使用命令行参数来执行更新或内核检查以及是否重新启动。然后 Puppet 管理这两个文件。由于您要处理基于 rpm 和 dpkg 的系统,我可能会创建两个脚本或do_update
为这两种类型创建单独的函数,并使用不同的命令行开关调用每个函数。然后,您可以通过检查文件声明中的事实来推出正确的脚本operatingsystem
,或者模板化 cron 条目并使用相同的事实来决定使用哪个开关。
使用经过充分测试的脚本,此方法效果很好。事实上,此设置已经成功使用了几年,处理了数百个系统。当内核打包程序开始向文件添加越来越多的次要版本级别时,我们偶尔会看到问题,而比较例程会阻塞。
答案2
答案3
如果你的主机是 RHEL 主机,你可能需要查看RHN 卫星。 否则太空行走可能值得一看**(见下文注释)。它们旨在管理上游软件包存储库的本地副本,并方便管理注册到 RHN Satellite 服务器的系统。您可以安排在特定时间更新软件包,或者如果您启用了 OSAD,则可以在 RHN Satellite/Spacewalk Web GUI 中安排在近期更新。
下面有些人发布了使用 puppet 的帖子,也有一些博客和网页介绍了如何将 Puppet 与 RHN Satellite 集成。
或者....
如果你对最终将取代 RHN Satellite 的新兴项目更感兴趣,你可以看看卡特洛项目。Katello 包含许多项目,这些项目是 Red Hat CloudForms 产品的一部分,据说是 RHN Satellite 最终替代品的上游。事实上,Katello 通过使用 Foreman 集成了 Puppet。从长远来看,Katello 绝对比 Spacewalk 更值得考虑(但由于订阅/支持,RHN Satellite 还不是)。
** 在我的文章中,我将 RHN Satellite 和 Spacewalk 都称为 RHN Satellite,以便于理解。真正的区别在于您是否拥有 RHEL 系统,如果是,您将需要 RHN Satellite,因为它可以以受支持的方式从 RHN 下载,Spacewalk 适合使用 RHEL 或 Fedora 重建版的用户(我知道 Spacewalk 可能也支持 Debian,但我个人对此了解不多)。因此,在搜索信息时,可能需要搜索 Spacewalk 和/或 RHN Satellite
答案4
Debian/Ubuntu 系统可以按如下方式更新:
class { 'apt': update => { frequency => 'weekly', }, }
之后,为了运行upgrade
,您可以应用下面显示的相同技巧。
对于 CentOS/RedHat 系统,你可以将 exec 订阅到哑文件:
exec { 'yum-update': command => '/usr/bin/yum -q -y update', refreshonly => true, subscribe => File['/some/dumb/file']; }
你/some/dumb/file
在 puppet 上更新,它会触发 yum 更新
如果您不想无人值守地运行它,您可能需要使用 Salt-stack。请注意,salt-minion 在更新期间不会自行更新。ZeroMQ 将突然关闭连接,更新将被中断,您需要重建软件包数据库(这发生在我一堆 Debian 服务器上)。