2012-12-26 4 views
8

Possiedo 13 server Windows che eseguono Jenkins Slaves. Per qualche ragione (aggiornamenti di Windows?), Gli schiavi di Jenkins abbandonano periodicamente il lavoro e il servizio Jenkins Slave deve essere riavviato. Se io SSH manualmente alle macchine (server SSH cygwin è in esecuzione) digito semplicemente:Automazione di SSH a Windows con Ruby

net stop "Jenkins Slave" 
net start "Jenkins Slave" 

e questo (quasi) sempre risolve il problema.

Così ho scritto uno script Ruby per automatizzare questo.

Ecco è:

#!/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 
} 

lo script viene eseguito su tutte le macchine, vedo in uscita che il servizio è stato avviato. Tuttavia, questo mai funziona. Quando ritorna alla macchina, il servizio non è stato avviato.

Purtroppo non posso usare Linux, non ho il controllo di queste macchine.

Qualche idea sul perché un SSH eseguito manualmente funziona, ma lo script no?

Grazie Phil

+0

È richiesto ruby, perché qualcosa come lo script di PowerShell potrebbe funzionare meglio se è stato progettato per questo tipo di attività di amministrazione – Egryan

risposta

2

ho provato nella leva e trovato due questioni:

  1. HOST è indefinito, dovrebbe essere host quanto questa è la variabile viene passata al blocco.
  2. SSH.start si aspetta che i parametri siano classe STRING, quindi aggiungere .to_s come indicato di seguito.

Inoltre, l'ho passato al modello di Ruby idiomatico dell'uso di do...end quando un blocco si estende oltre 1 riga.

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 

Ho provato questo in Pry e ora funziona. Spero che aiuti.

+1

LOL! Ho avuto quella variabile HOST nel mio codice e rimossa quando ho incollato. Quindi è stato SSHing su un server più e più volte :) –

+1

Scommetto che un HOST è stato riavviato molto bene :) – ZPH