2012-12-26 12 views
8

私はJenkins Slavesを実行する13のWindowsサーバを持っています。なんらかの理由(Windowsの更新?)では、Jenkinsスレーブは定期的に動作を停止し、Jenkins Slaveサービスを再起動する必要があります。私は手動でSSH(cygwinのSSHサーバが実行されている)のマシンに私は単純に入力した場合:Rubyを使ってWindowsに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 
} 

スクリプトは、すべてのマシン上で実行し、私はサービスが開始された出力を参照してください。ただし、は決してです。私がマシンに戻ってくると、サービスは開始していません。

悲しいことに、私はLinuxを使うことができません - 私はこれらのマシンを管理していません。

なぜ手動で実行されたSSHが動作するのですが、スクリプトではないのですか?

おかげ フィル

+0

ルビーが必要なのですが、powershellスクリプトのようなものがおそらくもっとうまくいくでしょう。この種の管理タスク用に設計されています – Egryan

答えて

2

私は詮索でそれを試してみたし、二つの問題が見つかりました:

  1. HOSTが定義されていないが、これがブロックに渡される変数であるとして、それはhostする必要があります。
  2. SSH.startは、パラメータがSTRINGクラスであると想定しているので、以下に示すように.to_sを追加してください。

また、Iブロックは、過去の1本のラインを拡張するときdo...endを用いる慣用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でテストしました。現在は動作しています。私はこれが役立つことを願っています

+1

LOL!自分のコードにHOST変数があり、貼り付けたときに削除されました。だからそれは1つのサーバーにSSHingしていた以上: –

+1

私は1つのホストが非常によく再起動されたことを賭ける:) – ZPH

関連する問題