0

Работа с приложением, которое будет использоваться администратором только для создания нескольких экземпляров другого приложения.Создание пользователя Mysql в действии контроллера Rails

Иными словами, app A будет использоваться для создания клонов app B на сервере и создания всех конфигураций, необходимых для запуска этого клонированного приложения на субдомене new_clone.domain.com.

Удаленное клонирование приложения, созданный файл конфигурации apache, файл unicorn server settings. Удалось запустить rake db:create; db:migrate, но я сделал это с пользователем root пользователя mysql.

В точке, где я клонировать приложение, сгенерировать database.yml файл для нового клонированного приложения, которое имеет в данный момент username и password набора как root, но я woould хотел бы иметь другой пользователь для каждого клонированного приложения.

Приложение А имеет модель под названием Subdomain, в subdomains_controller.rb на create действие я все вещи, клон, генерировать файлы конфигурация, выполнение задач рек, и т.д ..., а также в этом create действия Мне нужно создать новый пользователь Mysql с привилегиями для конкретной базы данных.

То, что я пытался до сих пор, не могу сказать, что я много сделал, я попытался запустить команду MySQL в контроллере создать действие:

def create 
    if @subdomain.save 
    .... 
    system "mysql -u root -p root; create database new_database;..." 
    .... 
    else 
    .... 
    end 
end 

, но это не ставит свою создать действие на удержание до I введите пароль, и даже если я найду способ его преодолеть, я не уверен, что остальные команды mysql будут работать. Вероятно, есть лучший способ добавить пользователя Mysql с одной командной строкой, не входя в консоль mysql.

спасибо.

+0

ли ваш пользователь имеет привилегии, необходимые для базы данных или создания пользовательского ? –

+0

ну, мой пользователь root да, но это идея - при создании нового пользователя у него должны быть привилегии для создания базы данных и иметь все виды привилегий только в этой базе данных. – rmagnum2002

+0

Эта команда запрашивает пароль root только потому, что существует пробел между '-p' и' root', проверьте страницу 'mysql' man. – toro2k

ответ

1

Насколько я понял, ваш метод создания работает под Rails-приложением с пользователем root mysql. Тогда вы можете просто выполнить команды MySQL через AR адаптер:

# Create DB 
ActiveRecord::Base.connection.execute("CREATE DATABASE IF NOT EXISTS \ 
`#{ActiveRecord::Base.sanitize(db_name)}` CHARACTER SET = `utf8` \ 
COLLATE = `utf8_general_ci`")  
# Create User 
ActiveRecord::Base.connection.execute("REPLACE INTO mysql.user \ 
(Host, User, Password) VALUES(\"localhost\", \ 
\"#{ActiveRecord::Base.sanitize(db_user)}\", \ 
PASSWORD(\"#{ActiveRecord::Base.sanitize(db_password)}\"))") 
# Grant access 
ActiveRecord::Base.connection.execute("GRANT ALL PRIVILEGES ON \ 
`#{ActiveRecord::Base.sanitize(db_name)}`.* TO \ 
`#{ActiveRecord::Base.sanitize(db_user)}`") 
# Apply 
ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES") 
+0

Спасибо, вы ответили много, но мне удалось сделать его немного короче. Я отправлю его в качестве ответа тоже. – rmagnum2002

0

Благодаря ответ Юрий, я получил это работает в более короткий путь:

def create_mysql_user 
    @db_name = "#{@subdomain.name}_domain_production" 
    @db_user = "#{@subdomain.name}_user" 
    @db_password = "#{@subdomain.name}domain_password" 

    ActiveRecord::Base.connection.execute("GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, 
     INDEX ON `#{@db_name}`.* TO #{ActiveRecord::Base.sanitize(@db_user)}@localhost 
     IDENTIFIED BY #{ActiveRecord::Base.sanitize(@db_password)};") 
    # Apply 
    ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES") 
    end 
Смежные вопросы