许多服务器的系统更新


11

我们有许多服务器,但仍想全部更新。实际的方法是,任何系统管理员都需要从一个服务器到另一个服务器,并创建一个aptitude update && aptitude upgrade-仍然不酷。

我正在寻找一种更好,更智能的解决方案。木偶可以做这项工作吗?你怎么做呢?


是的,木偶可以做到这一点。cssh也会在短期内解决您的问题。
Sirex

Answers:


10

您可以使用以下exec类型:

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

老实说,我自己没有尝试过,但是我认为您只需要创建一个包含此类exec定义的新模块即可。

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


看起来很好!我想我用一些Testmachines创建了一个Puppet用例来尝试这个。非常感谢!
丹尼斯·威斯尼亚

3
+1推荐人偶!改变您作为系统管理员的生活:)
Antoine Benkemoun 2012年

3
请注意,该执行程序将在每次Puppet运行时(每30分钟)运行一次,如果您有“大量服务器”,这可能会严重影响您的代理和/或镜像。就个人而言,我建议为上面的exec类型实现一个时间表,例如确保它仅在晚上运行。但是,在我看来,Puppet是用于强制系统状态的,运行类似upgrade_packages的命令而无须人工监督,这既令人恐惧,也有点滥用Puppet。Puppet Enterprise随附的mColective工具(或其等效于开源)可能是一个更好的选择。
wzzrd 2012年

7
我们的p安装有一个类似的exec,它检查文件上的时间戳,并且仅在升级版本比客户端上的版本新时才运行升级。当我们想要升级所有内容时,我们touch会将文件存储在人偶主文件上。
Ladadadada 2012年

@wzzrd:好点,但是如Ladadadada所说,通过检查一些外部条件可以使它更好。
哈立德

7

如果所有主机均为debian,则可以尝试无人值守升级软件包。

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

在这里,我们一直在使用puppet来管理我们的debian虚拟机,使用puppet能够在所有服务器上启用和管理不需升级的配置。

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

[s]古托


5

我建议您选择Puppet,facter和mCollective。

mCollective是一个非常不错的框架,您可以使用事实作为过滤器在一系列主机(并行)上运行命令。

加上本地代理/缓存,您将可以很好地进行服务器管理。


我同意,Puppet并不是管理大量/精心设计的软件包更新之类的管理操作的最佳工具。
罗比

3

使用使在多个服务器上运行单个命令的工具。而且,这并不是说要用Terminator或ClusterSSH打开成千上万的终端,而是要在运行适合该工作工具的管理服务器上使用单个终端。

在这种情况下,我建议使用func,Salt或mCollective。如果您已经有了Puppet,请使用mCollective(它可以很好地集成到Puppet中)。如果不这样做,并且您的计算机上装有旧的Python,则可能会喜欢func。如果您是Python新手,请尝试Salt。所有这些工具都是异步运行在命令行中指定的命令,这比顺序ssh循环甚至在多个终结器窗口到多个服务器中执行相同的智能命令要有趣得多。

您一定会爱上 Salt


2

因此,我想有很多因素可以促成一个好的解决方案:

  • 带宽
  • 易于管理
  • 详细记录,以防万一。

带宽:基本上我想到了两种节省带宽的方法:

  • 设置Debian镜像并将所有客户端配置为使用该镜像,有关更多详细信息,请参见http://www.debian.org/mirror/。(我会推荐这个)
  • 设置代理(apt-cacher,apt-proxy或Squid)并增加缓存,以便所有客户端都可以从此缓存中受益

管理:如果我先前在示例计算机上测试了命令,那么我将配置并行外壳(如PDSHPSSHGNU Parallel)并在所有客户端上发出命令。然后它不太可能在所有其他故障上失败。或者,您可以考虑在所有客户端上执行cron作业,但随后该作业可能会自动失败,因此我希望使用第一种解决方案。

如果您担心升级的同时性,可以安排命令 at

日志记录:与并行Shell一样,您可以重定向输出,我可以将stderr和stdout合并并将其写入日志文件。


带宽:有一些专用于deb存储库的缓存代理,请寻找apt-cacher或apt-proxy。
S19N 2012年

太好了,我会将此整合到答案中。
2012年

而mCollective之类的软件将允许并行命令执行并报告输出/结果。
CloudWeavers'1

1

我自己的并行ssh包装器:classh是那里各种Parallel和Cluster ssh工具的替代方法。

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

  • 它的安装和使用非常简单:一个.py文件,除了Python 2.5标准库外没有任何外部依赖。
  • 在其极限范围内,它是极其可靠的。我在每个工作日都使用它,通常每天将近使用100次,通常每个命令收集数百至数千个目标。(我已经一次在超过25,000台服务器的目标列表上进行了测试)。它从不会失败,无法完成或给我任何不确定的行为。(唯一的限制与Python subprocess.communicate()方法的限制有关,因此您只能捕获大约64K的stdout,例如,分别捕获多达64K的stderr;任何试图从其stdin读取的远程进程也都将停滞不前直到本地ssh子进程被杀死,由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>

这里的所有都是它的。例如,在嵌套的完成循环中,您可以收集所有返回某些退出状态或扫描特定错误消息的列表,并设置后续作业来处理这些错误。(这些作业将同时运行,默认情况下会随时运行100个作业,直到每个作业都完成;因此,数百个主机上的简单命令通常在几秒钟内完成,而非常复杂的Shell脚本在一个长命令字符串中..例如,大约有50条线...可以在大约10分钟内完成几千个主机...在我的环境中,每小时可以容纳约1万个主机,其中许多位于洲际。

因此,在实施人偶配置并进行良好测试之前,您可以将其用作临时措施,并且对主机进行少量临时调查以查看哪些主机偏离了您的标准也很方便。各种小方法。


顺带一提,在classh网页上的bitbucket.org上,我还列出了其他各种ssh包装程序的清单,这些清单我决定自己编写。他们中的任何一个都可以为您工作。另外,您可能会查找Python Fabric,这是一个较新的项目,具有类似的功能,尽管功能更全面,更复杂。
吉姆·丹尼斯

1

使用exec的答案非常有帮助。

但是,根据apt-get手册,以这种方式使用-q = 2并不是一个好主意(尽管我已经使用了很多年没有问题)

-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-get的方式如下:

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

人们提到的诸如木偶之类的工具和其他工具肯定可以工作,但是对于基本上只是模仿人类键入的一些命令来说,这似乎有些过头了。我相信使用最简单的工具来完成一项特定的工作,在这种情况下,bash脚本在不损失功能的情况下变得尽可能简单。


是的,对于某些服务器,我认为这是一个好方法。但是,如果我应该获得更多选择(在每台服务器上部署一些配置等),那么它的p将是更好的选择。我目前正在研究木偶及其漂亮的木偶
。–丹尼斯·威斯尼亚

我不同意。但是出于发布者询问的目的,这可能是过大的。
aseq 2012年

1

多年来,我一直在使用apt-dater来愉快地升级和安装软件包。它是用于远程软件包管理的轻量级有效工具。它使用screensudossh
对于软件包管理,apt-dater可能比配置管理工具更容易解决。
apt-dater在不同的GNU / Linux版本(例如Debian和CentOS)上进行集中式软件包管理非常方便。


1

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


0

使用webmin并使用其webmin集群功能,在此功能中,您可以将所有系统添加到一个webmin控制台中,并发出任何命令或从一个位置控制所有系统。

要么

使用集群ssh

要么

SSH服务器


是的,我确实可以打开很多窗口,并且可以并行工作。群集SSH很酷,但是我认为它不够聪明。
丹尼斯·威斯尼亚

0

如果您的所有主机都在运行Debian(或衍生产品),则另一种解决方案是使用cron-apt软件包。但是,根据文档建议,必须格外小心。

我目前在许多服务器上使用cron-apt来自动执行所有安全更新,而无人值守。为了避免不必要的升级,我只在运行Debian稳定发行版的服务器上使用cron-apt,并且确保配置我的apt源,因此使用发行版名称wheezy,而不使用其别名(稳定)。

我使用的特定cron-apt配置总结在一个操作文件中: /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"

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.