2

ssh を介していくつかのサーバーと通信する必要がある Rails アプリがあります。私はNet::SSHライブラリを使用していますが、うまく機能します。ただし、リクエスト間で何らかの方法でssh接続をキャッシュ/保存できるようにしたいと思います(OpenSSHの多重化など)。

そのため、 Memcached や Redis などのキー値ストアにそれらを格納することはできません(ssh 接続はシリアル化できないため)。

それらはすべてのユーザーが使用することを意図しているため、セッションに保存したくありません(さらに、シリアライズ可能である必要があると思います)。

クラス変数初期化定数を使用してこれを機能させることができました。クラス変数がサーバー間で (本番環境で) 複製されないことはわかっています。また、初期化子定数も複製されないことは確かです。何かのようなもの:

初期化子:

SSH = {}

モデル:

class Server
    def connection
        require 'net/ssh'
        SSH[name] ||= Net::SSH.start(ip, "root", :password => password)
    end
end

OpenSSHの多重化は素晴らしいことですが、Net::SSH ruby​​ ライブラリを介してそれを行うことができるかどうかはわかりません (マスター接続をどこかに保存することに戻りました)。

他の解決策はありますか?または、そうでない場合、それらすべての中で最も悪が少ないのはどれですか?

4

2 に答える 2

1

おそらく、リクエスト間でソケットを共有しようとするのではなく、何らかのバックグラウンド プロセッサに委譲することができます。ssh トンネルをセットアップし、DRb を使用して、それが単なるローカル ネットワーク デーモンであるかのように、または多数のネットワーク化された非同期ジョブ処理デーモンのいずれかであるかのように対話することができます。

http://ruby-toolbox.com/categories/queueing.html

于 2011-01-21T19:14:02.890 に答える
0

リクエスト間で SSH 接続を維持するには、バックグラウンド プロセスを生成する必要があります。バックグラウンド プロセスは、パイプまたはその他の種類のプロセス間通信メソッド(シリアライズ可能な方法で格納できるハンドル) を開くことができます。

これは重要な演習であることに注意してください。そのため、高レベルの詳細のみを説明しました。

于 2011-01-21T18:56:13.543 に答える