Linux软件包安装

我正在pipe理超过100台服务器,我有一些需要更新的软件包。 目前,我只有一个shell脚本for loop在所有服务器上运行一个for loop并执行命令。

有谁知道最好(或更好)的方式来做到这一点?

如果你运行的服务器超过100个,你应该看看一个configurationpipe理系统,比如cfengine,puppet,bcfg2等等。一个configuration良好的系统将能够很容易地推出常规软件包升级,很less或没有额外的脚本。

我所做的是创build我自己的内部回购(这很简单):

  1. 创build一个web访问目录
  2. 把RPM放在那里
  3. 运行“createrepo ./”
  4. 通过将以下文件添加到/etc/yum.repos.d/目录中,指向您的客户端:
 name=My Repo baseurl=http://path/to/directory/above gpgcheck=0 

您现在可以从您创build的目录安装RPM。

请注意,此解决scheme没有固有的安全性…它不检查包的签名状态。 设置gpg签名的步骤并不困难,详细说明如何: http : //mindtrove.info/articles/hosting-a-yum-repository/

我们有一个类似开发的工具(用python写在这里,在我以前的工作perl)工具Aleksandr,这种方法往往工作得很好。

我曾经见过一种专为这种东西而devise的工具,它吸引了我的兴趣, TakTuk,但是我没有足够的时间压低并开始使用它。 它的devise考虑了可扩展性,所以如果您的环境可能不断增长,您可能需要考虑一下。 卡皮斯特拉诺也许也值得调查。

Spacewalk是红帽卫星服务器的上游FOSS版本。 如果您需要比单个脚本提供的function更强大的function,则可以尝试一下。

Spacewalk:免费和开源的Linux系统pipe理

您可以并行执行这些命令,而不是一个for循环,然后以您想要的顺序依次收集输出。 我编写了下面的Ruby脚本,并使用它几年来进行大量的软件包安装,快速configuration更改和其他任务。 它加速了很多事情:

脚本:在所有节点上运行

 #!/usr/bin/ruby EXCEPT = [] require "open3" SSH_OPTIONS = ["-o PreferredAuthentications=hostbased,gssapi,gssapi-with-mic", "-o ForwardX11=no", "-o BatchMode=yes", "-o SetupTimeOut=5", "-o ServerAliveInterval=5", "-o ServerAliveCountMax=2" ].join(" ") SSH = "/usr/bin/ssh #{SSH_OPTIONS}" MKDIR = "/bin/mkdir" raise "give this command at least one argument" if ARGV.size < 1 COMMAND = ARGV[0..-1].join(' ') output_o = {} output_e = {} FORMAT = "%Y-%m-%d_%H-%M-%S_#{(rand * 100).to_i}" IO_CONNECTIONS_TO_REMOTE_PROCESSES = {} def on_all_nodes(&block) 1.upto(32) do |i| next if EXCEPT.include? i node = "node#{i.to_s.rjust(2, '0')}" block.call(node) end end # Create processes on_all_nodes do |node| stdin, stdout, stderr = Open3.popen3("#{SSH} #{node} \"#{COMMAND}\"") IO_CONNECTIONS_TO_REMOTE_PROCESSES[node] = [stdin, stdout, stderr] end has_remote_errors = false # Collect results on_all_nodes do |node| stdin, stdout, stderr = IO_CONNECTIONS_TO_REMOTE_PROCESSES[node] stdin.close e_thread = Thread.new do while line = stderr.gets line.chomp! STDERR.puts "#{node} ERROR: #{line}" has_remote_errors = true end end o_thread = Thread.new do first = true while line = stdout.gets line.chomp! puts "#{node} : #{line}" end end # Let the threads finish t1 = nil t2 = nil while [t1, t2].include? nil if t1.nil? t1 = e_thread.join(0.1) # Gives 1/10 of a second to STDERR end if t2.nil? t2 = o_thread.join(0.1) # Give 1/10 of a second to STDOUT end end end exit(1) if has_remote_errors 

杂项备注

上面的脚本依赖于主机的标准命名模式。 它是node01 node02 … node99 。 如果您的主机名称不同,则可以在/ etc / hosts中使用统一的别名。

因为你有更多的服务器,那么我需要调整脚本来使用类似于: n001 n002 … n100

安装一个软件包后运行一个检查。 我使用Debian,但是在CentOS / RedHat系统上,它会像on-all-nodes-run yum info <package-name>

我使用每个节点运行多个节点 ,但是在某个时候,一个节点将不可避免地被closures,最终会过期。 因此, on-all-nodes-run我重新映像的节点时,有机会重新启动(SystemImager,可能KickStart,…)。 整个分类器在每年重新映像几次,每次失败的过期节点重新启动。