net-ssh и ActiveRecord 3: объединяем все вместе - PullRequest
0 голосов
/ 06 февраля 2011

Я работаю над небольшой программой на Ruby, которая ежедневно подключается к удаленной базе данных MySQL Bugzilla, выполняет запрос записей и отправляет подробности этих записей по электронной почте группе.

До сих пор я был в состоянии SSH к серверу db и выполнить команду, используя net-ssh. Вот пример:

require 'net/ssh'

Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
result = ssh.exec!("ls -l")
puts result
end

Это выводит просто отлично.

Используя ActiveRecord 3.0.3, я хотел протестировать метод establish_connection, поэтому я установил соединение с локальной базой данных MySQL и смог выполнять команды с помощью ActiveRecord. Пример:

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

Итак, у меня возникли проблемы - собрать все это вместе и применить к моей удаленной базе данных MySQL. Вот моя лучшая попытка:

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

Но все, что от этого зависит, - это зависание моего сеанса IRB (что может быть совершенно нормальным ... не знаю). В случае, если зависание было нормальным, я открыл новый сеанс IRB и попытался установить соединение с удаленной базой данных следующим образом:

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

Итак, я понятия не имею, что идет не так или как его размазать. Любые предложения будут полезны.

Я на Mac OSX. БД, к которой я пытаюсь подключиться, находится на FreeBSD 7.0 и является версией MySQL Ver 14.12 Distrib 5.0.67.

1 Ответ

0 голосов
/ 06 февраля 2011

Вместо того, чтобы пытаться туннелировать соединение ActiveRecord внутри SSH, вы пытались подключиться напрямую от ActiveRecord к серверу БД?Это нормальный способ подключения по сети, который поддерживается ActiveRecord напрямую.

Замените идентификатор хоста на IP-адрес хоста сервера или запись DNS, возможно, для порта по умолчанию разрешено использование драйвера MySQL по умолчанию:3306, и сокет не нужен, поскольку БД находится на удаленном хосте.

Если хост БД не находится в той же сети, что и ваша, и вы пересекаете межсетевые экраны, возможно, вам потребуетсяэтот порт открыт, чтобы разрешить соединение.Если он находится в той же сети, он должен работать вообще без ssh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...