使用Ruby自动SSH到Windows

我有一台运行Jenkins Slaves的13台 Windows服务器.由于某种原因(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工作的任何想法,但脚本没有?

谢谢
菲尔

解决方法

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

> HOST未定义,它应该是主机,因为这是传递给块的变量.
> SSH.start期望参数为STRING类,因此请添加.to_s,如下所示.

此外,当一个块延伸超过1行时,我将其切换为使用do … end的惯用Ruby模式.

hosts.each do |host|
    puts "SSHing #{host} ..." 
    Net::SSH.start( host.to_s,:password => PASS ) do |ssh|
        puts ssh.exec!('date')
        puts "Logging out..."
    end
end

我在Pry测试了这个,它现在正在工作.我希望这有帮助.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...