我管理着100多台服务器,我有一些软件包需要更新。目前,我只有一个shell脚本在所有服务器上运行一个for loop并执行命令。
有谁知道做这件事的最好(或更好)方法吗?
发布于 2010-11-04 15:57:33
如果您运行的是100+服务器,那么您确实应该研究一下配置管理系统,例如cfengine、push、bcfg2等。配置良好的系统可以很容易地推出常规的包升级,只需很少或没有额外的脚本。
发布于 2010-11-04 15:03:59
我所做的是创建我自己的内部回购(这是痛苦的简单):
name=My Repo baseurl=http://path/to/directory/above gpgcheck=0
您现在可以从您创建的目录中安装RPM。
请注意,此解决方案没有固有的security...it不检查包的签名状态。设置gpg签名的步骤并不困难,并在下面的howto:http://mindtrove.info/articles/hosting-a-yum-repository/中详细介绍了
发布于 2010-11-04 14:16:16
而不是for-循环,您可以并行执行命令,然后按所需的顺序顺序收集输出。我编写了下面的Ruby脚本,并将其用于大规模包安装、快速配置更改和其他任务。它大大加速了事情的发展:
#!/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在一年前被重新映射几次,每次失败的过时节点被重新启动。
https://serverfault.com/questions/198205
复制相似问题