我有 13 个运行 Jenkins Slaves 的 Windows 服务器。出于某种原因(windows 更新?),Jenkins slaves 周期性地停止工作并且 Jenkins Slave 服务需要重新启动。如果我手动 SSH 到机器(cygwin ssh 服务器正在运行),我只需键入:
net stop "Jenkins Slave"
net start "Jenkins Slave"
这(几乎)总能解决问题。
所以我写了一个 Ruby 脚本来自动执行此操作。
这是:
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
USER = 'Administrator'
PASS = 'PASSWORD'
hosts = [:breckenridge, :carbondale, :crestone, :denali, :gunnison, :sneffels, "mammoth", "whitney", "snowmass", "firestone", "avon", :grizzly, :silverton]
hosts.each {|host|
puts "SSHing #{host} ..."
Net::SSH.start( HOST, USER, :password => PASS ) do |ssh|
puts ssh.exec!('net stop "Jenkins Slave"')
puts ssh.exec!('net start "Jenkins Slave"')
puts "Logging out..."
end
}
脚本在所有机器上执行,我看到服务已经启动的输出。但是,这从不 起作用。当我 ssh 回到机器时,服务还没有启动。
遗憾的是,我无法使用 Linux - 我无法控制这些机器。
关于为什么手动执行的 SSH 有效,但脚本却无效的任何想法?
谢谢 菲尔
最佳答案
我在 Pry 中试了一下,发现了两个问题:
- HOST 未定义,它应该是
host
,因为这是传递到 block 中的变量。 - SSH.start 需要参数为
STRING
类,因此添加.to_s
,如下所示。
此外,我将其切换为惯用的 Ruby 模式,即当 block 超出 1 行时使用 do...end
。
hosts.each do |host|
puts "SSHing #{host} ..."
Net::SSH.start( host.to_s, USER, :password => PASS ) do |ssh|
puts ssh.exec!('date')
puts "Logging out..."
end
end
我在 Pry 中对此进行了测试,它现在可以正常工作了。我希望这会有所帮助。
关于ruby - 使用 Ruby 自动 SSH 到 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044289/