Автоматизация SSH для Windows с помощью Ruby

У меня есть 13 оконных серверов под управлением Jenkins Slaves. По какой-то причине (обновления Windows?), Подчиненные Jenkins периодически прекращают работу, и служба 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
}

Сценарий выполняется на всех машинах, я вижу вывод, что служба запущена. Однако это никогда не работает. Когда я возвращаюсь к машине, служба еще не запущена.

К сожалению, я не могу использовать Linux - я не контролирую эти машины.

Любые идеи о том, почему работает SSH вручную, но сценарий не работает?

Спасибо фил

1 ответ

Решение

Я попробовал это в Pry и нашел две проблемы:

  1. Хост не определен, он должен быть host поскольку эта переменная передается в блок.
  2. SSH.start ожидает, что параметры будут STRING класс, так что добавьте .to_s как указано ниже.

Кроме того, я переключил его на идиоматический шаблон использования Ruby do...end когда блок проходит за 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

Я проверил это в Прай, и теперь он работает. Надеюсь, это поможет.

Другие вопросы по тегам