net-ssh y activerecord 3: reunirlo todo
-
29-10-2019 - |
Pregunta
Estoy trabajando en un pequeño programa de Ruby que se conectará a una remota base de datos MySQL Bugzilla, realizará una consulta de registros y los detalles de correo electrónico de esos registros a un grupo a diario.
Hasta ahora, he podido SSH al servidor DB y ejecutar un comando usando Net-SSH. Aquí hay un ejemplo:
require 'net/ssh'
Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
result = ssh.exec!("ls -l")
puts result
end
Eso sale bien.
Usando Activerecord 3.0.3, quería probar el establish_connection
Método Así que establecí una conexión con mi base de datos MySQL local y pude ejecutar comandos usando Activerecord. Ejemplo:
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "list_tool_development",
:username => "my_username",
:password => "secretpassword"
)
class MailingList < ActiveRecord::Base
end
MailingList.first #=> Successfully retrieves first record from the table
Entonces, donde tengo problemas es reunirlo todo y aplicarlo a mi remoto MySQL DB. Aquí está mi mejor intento hasta ahora:
require 'net/ssh'
Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
ssh.forward.local(3307, "127.0.0.1", 3306)
ssh.loop { true }
end
Pero todo lo que hace es hacer que mi sesión de IRB cuelgue (lo que podría ser completamente normal ... no lo sé). En caso de que cuelgue estaba Normal, abrí una nueva sesión de IRB e intenté establecer una conexión con la base de datos remota como así:
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "127.0.0.1",
:port => 3307,
:reconnect => false,
:database => "bugs",
:pool => 5,
:username => "my_username",
:password => "secret",
:socket => "/tmp/mysql.sock"
)
class Bug < ActiveRecord::Base #=> the table name in the "bugs" db is "bugs"
end #=> so I made the model singular
Bug.first #=> the IRB session hangs at this point
Entonces, no tengo idea de lo que está pasando mal o cómo delgularlo. Todas y cada una de las sugerencias sería útil.
Estoy en Mac OSX. El DB con el que estoy tratando de conectar es en FreeBSD 7.0 y es la versión MySQL ver 14.12 Distrib 5.0.67.
Solución
En lugar de intentar túnel la conexión Activerecord dentro de SSH, ¿ha intentado conectarse directamente de Activerecord al servidor DB? Esa es la forma normal de conectarse a través de una red y es compatible directamente por Activerecord.
Reemplace la ID de host con la entrada IP o DNS del host del servidor, el puerto probablemente puede ser predeterminado por el valor predeterminado del controlador MySQL de 3306, y el socket no es necesario ya que el DB está en el host remoto.
Si el host de DB no está en la misma red que la suya, y está cruzando los firewalls, es posible que deba tener ese puerto abierto para permitir la conexión. Si está en la misma red, debería funcionar sin necesidad de SSH.