首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux包安装

Linux包安装
EN

Server Fault用户
提问于 2010-11-04 14:05:30
回答 5查看 136关注 0票数 1

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

有谁知道做这件事的最好(或更好)方法吗?

EN

回答 5

Server Fault用户

回答已采纳

发布于 2010-11-04 15:57:33

如果您运行的是100+服务器,那么您确实应该研究一下配置管理系统,例如cfengine、push、bcfg2等。配置良好的系统可以很容易地推出常规的包升级,只需很少或没有额外的脚本。

票数 5
EN

Server Fault用户

发布于 2010-11-04 15:03:59

我所做的是创建我自己的内部回购(这是痛苦的简单):

  1. 创建一个可访问的web目录
  2. 把RPM放在那里
  3. 运行"createrepo ./“
  4. 通过将以下文件添加到/etc/yum.store.d/目录中,将客户端指向那里:

name=My Repo baseurl=http://path/to/directory/above gpgcheck=0

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

请注意,此解决方案没有固有的security...it不检查包的签名状态。设置gpg签名的步骤并不困难,并在下面的howto:http://mindtrove.info/articles/hosting-a-yum-repository/中详细介绍了

票数 3
EN

Server Fault用户

发布于 2010-11-04 14:16:16

而不是for-循环,您可以并行执行命令,然后按所需的顺序顺序收集输出。我编写了下面的Ruby脚本,并将其用于大规模包安装、快速配置更改和其他任务。它大大加速了事情的发展:

脚本:在所有节点上运行

代码语言:javascript
复制
#!/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/host中使用统一的别名。

因为您有更多的服务器,所以您需要调整我的脚本以使用类似于: n001 n002 .n100。

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

我每个月在所有节点上运行几次,但在某一时刻,一个节点不可避免地会下降,并将结束过时。因此,在on-all-nodes-run之上,当有机会重新启动时,我会重新映像节点(SystemImager,可能是KickStart,.)。整个clsuter在一年前被重新映射几次,每次失败的过时节点被重新启动。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/198205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档