2012-12-26 59 views
8

我有一個運行Jenkins從站的13個Windows服務器。由於某些原因(Windows更新?),Jenkins奴隸定期退出工作,Jenkins奴隸服務需要重新啓動。如果我手動SSH到機器(cygwin的SSH服務器是否正在運行),我只需鍵入:使用Ruby自動化SSH到Windows

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 
} 

腳本執行上的所有機器,我看到服務已啓動輸出。但是,這個從來沒有的作品。當我回到機器上時,服務尚未開始。

不幸的是,我不能使用Linux - 我不控制這些機器。

任何有關爲什麼手動執行SSH工作的想法,但腳本不?

感謝 菲爾

+0

是否需要ruby,導致類似powershell腳本的東西可能會更好地工作有它被設計用於這些類型的管理任務 – Egryan

回答

2

我嘗試了一下在撬,發現兩個問題:

  1. HOST是不確定的,它應該是host,因爲這是變量被傳遞到塊。
  2. SSH.start預計參數爲STRING類,因此請按如下所示添加.to_s

此外,我將它切換到使用do...end的慣用Ruby模式,當一個塊延伸超過1行時。

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中測試了它,現在它正在工作。我希望這有幫助。

+1

LOL!我的代碼中有HOST變量,粘貼時被刪除。所以這是反覆SSH服務器到一臺服務器:) –

+1

我敢打賭,一個主機很好重新啓動:) – ZPH