8

我有 13 个运行 Jenkins Slaves 的 Windows 服务器。出于某种原因(Windows 更新?),Jenkins slave 会定期退出工作,并且需要重新启动 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 有效但脚本无效的任何想法?

谢谢菲尔

4

1 回答 1

3

我在 Pry 中试了一下,发现了两个问题:

  1. HOST 未定义,应该是host因为这是传递到块中的变量。
  2. SSH.start 期望参数是STRING类,所以添加.to_s如下所示。

此外,我将它切换为do...end当块超过 1 行时使用的惯用 Ruby 模式。

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 中对此进行了测试,现在可以正常工作了。我希望这有帮助。

于 2012-12-26T21:06:21.190 回答