Answers:
您可以使用以下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
如上所示的选项。
touch
会将文件存储在人偶主文件上。
如果所有主机均为debian,则可以尝试无人值守升级软件包。
http://packages.debian.org/sid/unattended-upgrades
在这里,我们一直在使用puppet来管理我们的debian虚拟机,使用puppet能够在所有服务器上启用和管理不需升级的配置。
最近,我们的团队正在测试mcollective工具以在所有服务器上运行命令,但是需要使用mcollective ruby技能。
[s]古托
我建议您选择Puppet,facter和mCollective。
mCollective是一个非常不错的框架,您可以使用事实作为过滤器在一系列主机(并行)上运行命令。
加上本地代理/缓存,您将可以很好地进行服务器管理。
使用使在多个服务器上运行单个命令的工具。而且,这并不是说要用Terminator或ClusterSSH打开成千上万的终端,而是要在运行适合该工作工具的管理服务器上使用单个终端。
在这种情况下,我建议使用func,Salt或mCollective。如果您已经有了Puppet,请使用mCollective(它可以很好地集成到Puppet中)。如果不这样做,并且您的计算机上装有旧的Python,则可能会喜欢func。如果您是Python新手,请尝试Salt。所有这些工具都是异步运行在命令行中指定的命令,这比顺序ssh循环甚至在多个终结器窗口到多个服务器中执行相同的智能命令要有趣得多。
您一定会爱上 Salt。
因此,我想有很多因素可以促成一个好的解决方案:
带宽:基本上我想到了两种节省带宽的方法:
管理:如果我先前在示例计算机上测试了命令,那么我将配置并行外壳(如PDSH,PSSH,GNU Parallel)并在所有客户端上发出命令。然后它不太可能在所有其他故障上失败。或者,您可以考虑在所有客户端上执行cron作业,但随后该作业可能会自动失败,因此我希望使用第一种解决方案。
如果您担心升级的同时性,可以安排命令 at
日志记录:与并行Shell一样,您可以重定向输出,我可以将stderr和stdout合并并将其写入日志文件。
我自己的并行ssh包装器:classh是那里各种Parallel和Cluster ssh工具的替代方法。
您可能会更喜欢它,或者可能讨厌它。我在这里提及的原因只有三个:
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万个主机,其中许多位于洲际。
因此,在实施人偶配置并进行良好测试之前,您可以将其用作临时措施,并且对主机进行少量临时调查以查看哪些主机偏离了您的标准也很方便。各种小方法。
使用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脚本在不损失功能的情况下变得尽可能简单。
如果您的所有主机都在运行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"
其他任何升级操作都是使用屏幕或最合适的方法手动完成的,因为在升级过程中可能需要手动干预。