conexiones ssh tiendas en los carriles
-
16-10-2019 - |
Pregunta
Tengo un raíles de aplicación que necesita para comunicarse con un par de servidores a través de ssh. Estoy usando el Net :: SSH biblioteca y funciona muy bien. Sin embargo me gustaría ser capaz de caché / almacenar las conexiones ssh alguna manera entre las solicitudes (algo así como OpenSSH Multiplexing).
Por lo tanto, no puedo guardarlos en un clave-valor tienda como Memcached o Redis (porque las conexiones ssh no son serializable).
Yo no quiero guardarlos en un sesión , ya que están destinados a ser utilizados por todos los usuarios (y además creo que tiene que ser serializable también).
Me las arreglé para conseguir este trabajo con variables de la clase y initiliazer constantes . Sé que las variables de clase no se replican entre los servidores (en la producción), y estoy bastante ciertas constantes de inicializador también no lo hacen. Algo así como:
inicializador:
SSH = {}
modelo:
class Server
def connection
require 'net/ssh'
SSH[name] ||= Net::SSH.start(ip, "root", :password => password)
end
end
OpenSSH multiplexación sería grande pero no estoy seguro de si podría hacerlo a través de la biblioteca Net :: SSH rubí (estoy de vuelta a algún lugar de almacenar la conexión maestro).
¿Hay otras soluciones? O si no, ¿cuál es el menos malo de todos ellos?
Solución
Tal vez en lugar de tratar a los sockets compartir a través de peticiones que está obligado a llegar a causar dolor y el sufrimiento que podría delegar en un procesador de fondo de algún tipo? Se podría establecer un túnel SSH y utilizar DRB al hablar a través de ella como si fuera sólo un demonio de red local, o cualquiera de la gran cantidad de demonios de Gestión de trabajos asíncronos conectados en red.
Otros consejos
Para mantener la conexión SSH entre peticiones, que necesita para desovar fuera un proceso de fondo. El proceso en segundo plano puede abrir una tubería o algún otro tipo de entre procesos método de comunicación , el mango a la que puede tienda de una manera serializable.
Tenga en cuenta que este es un ejercicio trivial, que es por eso que sólo he descrito en detalle alto nivel.