1

使用管理员仅用于创建另一个应用程序的多个实例的应用程序。

换句话说,app A将用于app B在服务器上创建克隆,并创建在子域上运行克隆的应用程序所需的所有配置new_clone.domain.com

管理克隆应用程序,创建apache配置文件,unicorn server settings文件。设法运行 rake db:create; db:migrate,但我用rootmysql 用户做了这个。

在我克隆应用程序的时候,我database.yml为新克隆的应用程序生成了一个文件,该文件此时具有usernamepassword设置为root,但我希望每个克隆的应用程序都有一个不同的用户。

应用程序 A 有一个名为 的模型Subdomain,在subdomains_controller.rbcreate操作中,我执行所有操作、克隆、生成配置文件、运行 rake 任务等……而且在此create操作中,我需要创建一个Mysql具有特定权限的新用户数据库。

到目前为止我已经尝试过,不能说我做了很多,我尝试在控制器创建操作中运行 mysql 命令:

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

但这会使我的创建操作暂停,直到我输入密码,即使我能找到一种方法来解决它,我也不确定其余的 mysql 命令是否会起作用。可能有一种更好的方法可以在不进入 mysql 控制台的情况下使用一个命令行添加 Mysql 用户。

谢谢你。

4

2 回答 2

2

据我了解,您的 create 方法使用rootmysql 用户在 Rails 应用程序下运行。然后你可以简单地通过 AR 适配器执行 mysql 命令:

# 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")
于 2013-06-20T10:47:19.533 回答
1

感谢 Yuriy 的回答,我让它以更短的方式工作:

  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
于 2013-06-20T11:31:04.720 回答