Храните ssh-соединения в рельсах - PullRequest
2 голосов
/ 21 января 2011

У меня есть приложение rails, которое должно общаться с парой серверов через ssh.Я использую библиотеку 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 ​​(я снова где-то хранил главное соединение).

Есть ли другие решения?Или, если нет, какой из них наименее злой из всех?

Ответы [ 2 ]

1 голос
/ 21 января 2011

Возможно, вместо того, чтобы пытаться разделять сокеты между запросами, что в конечном итоге приведет к боли и страданиям, которые вы могли бы делегировать некоторому фоновому процессору?Вы можете настроить ssh-туннель и использовать DRb для связи через него, как если бы это был просто демон локальной сети, или любой из большого числа сетевых демонов асинхронной обработки заданий.

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

0 голосов
/ 21 января 2011

Чтобы поддерживать соединение SSH между запросами, вам нужно запустить фоновый процесс. Фоновый процесс может открыть канал или какой-то другой метод межпроцессного взаимодействия , дескриптор которого вы можете сохранить в сериализуемом виде.

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

...