许多服务器的系统更新

我们有很多服务器,并且仍然想要全部更新它们。 实际的方法是,任何系统pipe理员从服务器到服务器,并进行aptitude update && aptitude upgrade – 它仍然不是很酷。

我正在寻找一个更好,更聪明的解决scheme。 木偶能做这个工作吗? 你怎么做呢?

您可以使用exectypes,如:

 exec { "upgrade_packages": command => "apt-get upgrade -q=2", path => "/usr/local/bin/:/bin/:/usr/bin/", # path => [ "/usr/local/bin/", "/bin/" ], # alternative syntax } 

说实话,我没有自己尝试,但我认为你只需要创build一个新的模块,包括这样一个exec定义。

apt-get upgrade命令是交互式的。 为了使其运行安静,您可以添加选项-q=2如上所示。

如果你所有的主机都是debian,你可以尝试无人值守的升级包。

http://packages.debian.org/sid/unattended-upgrades

在这里,我们一直在使用木偶来pipe理我们的debian虚拟机,使用木偶,我们可以在所有服务器上启用和pipe理unnatended-upgradeconfiguration。

最近我们的团队正在testingmcollective工具,以在所有服务器上运行命令,但是需要使用mcollective ruby​​技能。

Guto

我会build议去木偶,facter和mCollective。

mCollective是一个非常好的框架,您可以使用facter作为filter在一系列主机上运行命令(并行)。

添加到本地代理/caching,你会很好地设置服务器pipe理。

使用在多台服务器上运行单个命令的工具。 因此,我并不是说用Terminator或ClusterSSH打开一个kazillionterminal,而是让一个terminal连接到一个pipe理服务器上运行适合这个工作的工具。

我会在这方面推荐func,Salt或mCollective。 如果你已经有木偶,去mCollective(它很好地集成在木偶)。 如果你不这样做,而且你的机器上有一个老的Python,你可能会喜欢func。 如果你是新的Python,试试Salt。 所有这些工具asynchronous运行在命令行中指定的命令,这比顺序的ssh循环更有趣,甚至可以在无数个终结器窗口中对相同的服务器执行相同的aptitude命令。

你一定会喜欢 盐 。

所以我想有很多东西都有助于解决问题:

  • 带宽
  • 便于pipe理
  • 详细的日志logging,以防事情搞砸。

带宽 :基本上来说,有两种方法可以节省带宽:

  • 设置一个Debian镜像并configuration所有客户端使用这个镜像,请参阅http://www.debian.org/mirror/了解更多细节。 (我会推荐这个)
  • 设置一个代理(apt-cacher,apt-proxy或Squid)并增加caching,所有的客户端都可以从这个caching中获益

pipe理 :我会configuration一个像PDSH , PSSH , GNU并行的并行shell,并在所有的客户端上发出命令,如果我以前在示例机器上testing过这个命令的话。 那么它不可能在所有其他方面失败。 或者,您可以考虑在所有客户端上执行cron作业,但是可能会自动失败,所以我宁愿select第一个解决scheme。

如果你关心升级的同时性,你可以使用at来安排你的命令

日志logging :与并行shell一样,你可以redirect输出,我将stderr和stdout结合起来写入日志文件。

我自己的并行ssh包装器: classh是各种并行和群集ssh工具的替代品。

你可能会喜欢它,或者你可能会讨厌它。 我在这里提到的只有三个原因:

  • 安装和使用非常简单:一个.py文件,除了Python 2.5标准库之外,没有外部依赖关系。
  • 在极限内非常可靠。 我每个工作日都会使用它,通常每天接近100次,通常每个命令收集几百到几千个目标。 (我已经在一次超过25000台服务器的目标列表上进行了testing)。 它永远不会失败,没有完成或给我任何不确定的行为。 (唯一的限制与Python的subprocess.communicate()方法相关 – 所以你只能捕获大约64K的标准输出,并且,例如分别高达64K的stderr;也是任何试图读取的远程进程其标准input将简单地停止,直到本地sshsubprocess被终止,由classh的超时处理自动完成
  • 在Python中编写一个自定义脚本来使用classh.py作为模块非常简单。 所以写这样的东西很容易:

     !#/bin/env python import classh job = classh.SSHJobMan(cmd, targets) job.start() while not job.done(): completed = job.poll() for i in completed: # do something with the classh.JobRecord object referenced by i # done # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre> 

    !#/bin/env python import classh job = classh.SSHJobMan(cmd, targets) job.start() while not job.done(): completed = job.poll() for i in completed: # do something with the classh.JobRecord object referenced by i # done # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre>

这就是它的全部。 例如,在嵌套的完成循环中,您可以收集所有返回某些特定退出状态的列表,或者扫描特定的错误消息,并设置后续作业来处理这些错误消息。 (作业将同时运行,任何时候默认为100个作业,直到每个作业完成为止;因此,在几百个主机上的简单命令通常在几秒钟内完成,并且在一个长的命令string中有一个非常复杂的shell脚本。说五十行左右…可以在大约10分钟内完成几千个主机…在我的环境中每小时有10K个主机,其中许多位于互联网上)。

所以这可能是一个你可以用来作为临时措施的东西,直到你实现了你的木偶configuration和良好的testing…而且这也是对你的主机进行一些特别的调查,看看哪些是偏离你的标准各种小方法。

使用exec的答案是相当有帮助的。

但是根据apt-get手册,这样使用-q = 2并不是一个好主意(尽pipe我已经使用了多年,没有任何问题)

 -q, --quiet Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or -s as APT may decided to do something you did not expect. Configuration Item: quiet. 

我已经使用了一个脚本多年,运行apt – 得到以下方法:

 ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean" 

像傀儡和其他工具,人们提到的确定可能会起作用,但它似乎是矫枉过正的,基本上只是模仿人类input的几个命令。 我相信在一个特定的工作中使用最简单的工具,在这种情况下,一个bash脚本是如此简单,而不会失去function。

多年来,我一直在愉快地使用apt-dater升级和安装软件包。 它是轻量级和有效的远程包pipe理工具。 它使用screensudossh
对于包pipe理来说, apt-dater可能比configurationpipe理工具更简单。
apt-dater在Debian和CentOS等不同的GNU / Linux版本上集中pipe理软件包非常方便。

你可以使用Fabric 。 Fabric是一个Python(2.5-2.7)库和命令行工具,用于简化应用程序部署或系统pipe理任务的SSH使用。

使用webmin ,,,并使用其webmin群集function,您可以将所有系统添加到一个webmin控制台,并发出任何命令或从一个地方控制所有的系统。

要么

使用群集ssh

要么

PSSH

如果所有的主机都在运行Debian(或衍生产品),另一个解决scheme是使用cron-apt软件包 。 但是,按照文件build议,必须小心谨慎。

我目前正在十几台服务器上使用cron-apt来自动执行所有的安全更新并且无人值守。 为了避免任何不必要的升级,我只在运行Debian稳定分发的服务器上使用cron-apt,并且确保configuration我的apt源,所以使用分发名称, wheezy ,而不是其别名(stable)。

我使用的具体cron-aptconfiguration被汇总在一个动作文件中: /etc/cron-apt/action.d/5-install

 dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null" 

任何其他升级都是手动完成的,使用屏幕或其他最合适的方法,因为在升级过程中可能需要手动干预。