2

net-ssh-multiを使用して、サーバーのグループでコマンドを実行しようとしています。このタックでは、sshキー認証はオプションではありません。パスワードは、session.use行で定義された各サーバーに渡す必要があります。ここに問題があります。「net/ssh」はパスワードパラメータを受け取ることができますが、「net / ssh/multi」はできません。私がやりたいのは、次のようなことです。

require 'net/ssh'
require 'net/ssh/multi'

#The necessary data is contained in a Ticket object 

my_ticket = Ticket.new

Net::SSH::Multi.start (:password => 'xxxx') do |session|

  # define the servers we want to use

   my_ticket.servers.each do |serv_id|
     session.use "#{my_ticket.user_name}@#{serv_id}"
   end


  # execute commands on all servers
  session.exec "uptime"


  # run the aggregated event loop
  session.loop
end

しかし、これは私を取得します:

file.rb:35:in `start':間違った数の引数(1対2)(ArgumentError)from file.rb:35

これはちょっとしたn00bの質問だと思いますが、助けていただければ幸いです。

(http://rubydoc.info/gems/net-ssh-multi/1.1/Net/SSH/Multi)

4

1 に答える 1

2

答えは私が思っていたよりもはるかに簡単であることがわかりました。ドキュメントを調べてみると、クラスでこれに気づきました:Net :: SSH :: Multi :: Server docs:

クラス:Net :: SSH :: Multi :: Server

概要:

単一のリモートサーバーの接続情報と、その情報に対応するNet::SSHセッションをカプセル化します。これらのいずれかを直接インスタンス化する必要はめったにありません。代わりに、Net :: SSH :: Multi :: Session#useを使用する必要があります。

したがって、クラスの拡張やスーパークラスの呼び出しは必要ありません。上記は次の方法で実現できます。

require 'net/ssh'
require 'net/ssh/multi'


#The necessary data is contained in a Ticket object 
my_ticket = Ticket.new


Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  my_ticket.user_name ,  \
    :password => my_ticket.user_pass
  end


  # execute commands on all servers
  session.exec my_ticket.command_to_do
 
  # run the aggregated event loop
  session.loop
end
于 2011-05-29T23:38:55.213 に答える