質問

SSHを介していくつかのサーバーと通信する必要があるRailsアプリがあります。私は使用しています Net :: SSH 図書館とそれはうまく機能します。ただし、リクエスト間でSSH接続を何らかの形でキャッシュ/保存できるようにしたいと思います(OpenSSHマルチプレックスのようなもの)。

だから、私はそれらを保管することはできません キー価値ストア MemcachedまたはRedisのように(SSH接続がシリアル化できないため)。

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

私はこれをうまく機能させることができました クラス変数Initiliazer定数. 。クラス変数はサーバー間で(生産中)複製されないことを知っています。また、初期化の定数もかなり確実ではありません。何かのようなもの:

Initializer:

SSH = {}

モデル:

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

openssh 多重化 素晴らしいことですが、ネットを通してそれを行うことができるかどうかはわかりません:: SSH Rubyライブラリ(マスター接続をどこかに保存することに戻ります)。

他にソリューションはありますか?または、そうでない場合、どれがそれらのすべての悪であるのでしょうか?

役に立ちましたか?

解決

おそらく、何らかのバックグラウンドプロセッサに委任できる痛みや苦しみを引き起こすことになっているリクエスト間でソケットを共有しようとするのではなく? SSHトンネルをセットアップし、DRBを使用して、ローカルネットワークデーモン、または多数のネットワークの非同期ジョブハンドリングデーモンのいずれかであるかのように話します。

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

他のヒント

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

これは自明でない運動であることに注意してください。そのため、私はそれを高レベルの詳細でしか説明していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top