Conservare le connessioni SSH a rotaie
-
16-10-2019 - |
Domanda
Ho un applicazione Rails che deve comunicare con un paio di server attraverso ssh. Sto utilizzando il Net :: SSH biblioteca e funziona benissimo. Vorrei però essere in grado di cache / memorizzare le connessioni ssh in qualche modo tra le richieste (si parla di OpenSSH Multiplexing).
Quindi, non posso conservarle in un negozio di chiave-valore come Memcached o Redis (perché le connessioni ssh non sono serializzabile).
Non voglio per memorizzarli in un sessione , perché sono destinati ad essere utilizzati da tutti gli utenti (e inoltre penso che deve essere serializzabile anche).
Sono riuscito ad ottenere questo lavoro con le variabili class e initiliazer costanti . So che le variabili di classe non si replicano tra i server (in produzione), e sono abbastanza alcune costanti di inizializzazione anche non lo fanno. Qualcosa di simile:
initializer:
SSH = {}
modello:
class Server
def connection
require 'net/ssh'
SSH[name] ||= Net::SSH.start(ip, "root", :password => password)
end
end
OpenSSH multiplexing sarebbe bello, ma non sono sicuro se potessi farlo tramite la libreria Net :: SSH rubino (io sono di nuovo a memorizzare il posto di connessione master).
Ci sono altre soluzioni? O se no, quale è il minimo male di tutti?
Soluzione
Forse, piuttosto che cercare di prese di condivisione tra le richieste, che è destinata a finire per causare dolore e la sofferenza si può delegare ad uno sfondo processore di qualche tipo? Si potrebbe impostare un tunnel ssh e utilizzare DRB a parlare attraverso di esso come se fosse solo un demone rete locale, o una qualsiasi delle gran numero di demoni la gestione del lavoro asincroni in rete.
Altri suggerimenti
Per mantenere la connessione SSH tra le richieste, è necessario per deporre le uova fuori un processo in background. Il processo di sfondo può aprire un tubo o qualche altro tipo di interprocesso metodo di comunicazione , la maniglia a cui si possono negozio in modo serializzabile.
Si noti che questo è un esercizio non banale, che è il motivo per cui ho solo descritto è a dettaglio di alto livello.