使用Ruby/Chef Recipe for Vagrant导入Mysql数据库

Cra*_*ard 7 ruby mysql recipe chef-infra vagrant

我正在编写一个自动设置开发环境的厨师脚本.我可以创建一个数据库并授予权限,但我试图找到一种方法将mysql转储文件导入刚刚创建的数据库中.

我授予访问权限的代码是

ruby_block "Execute grants" do
  block do

    require 'rubygems'
    Gem.clear_paths
    require 'mysql'

    m = Mysql.new('localhost', "root", node[:mysql][:server_root_password])
    m.query("GRANT ALL ON *.* TO 'root'@'10.0.0.1' IDENTIFIED BY '#{node[:mysql][:server_root_password]}'")
    m.query('FLUSH PRIVILEGES')
end
end
Run Code Online (Sandbox Code Playgroud)

我希望我能够做以下查询 #m.query("-u root -p root db_name < /project/db/import.sql")

但只是给了我一个错误.

我没有做太多的Ruby,所以很难弄明白.谁知道我怎么能这样做?

s2t*_*2t2 5

如果它是文件路径错误,并且您正在使用chef solo,请尝试使用solo.rb中指定的路径,如:

/tmp/chef-solo/site-cookbooks/path_to_file.sql
Run Code Online (Sandbox Code Playgroud)

作为一般说明,考虑使用数据库cookbook进行mysql用户和数据库管理任务.一旦设置了必要的cookbook依赖项,就可以将这样的代码放入主配方的default.rb中:

# externalize conection info in a ruby hash
mysql_connection_info = {
  :host => "localhost",
  :username => 'root',
  :password => node['mysql']['server_root_password']
}

# drop if exists, then create a mysql database named DB_NAME
mysql_database 'DB_NAME' do
  connection mysql_connection_info
  action [:drop, :create]
end

# query a database from a sql script on disk
mysql_database "DB_NAME" do
  connection mysql_connection_info
  sql { ::File.open("/tmp/chef-solo/site-cookbooks/main/path/to/sql_script.sql").read }
  action :query
end

#or import from a dump file
mysql_database "DB_NAME" do
  connection mysql_connection_info
  sql "source /tmp/chef-solo/site-cookbooks/main/path/to/sql_dump.sql;"
end
Run Code Online (Sandbox Code Playgroud)

没有测试过最后一个,因为在chef目录中存储数据库文件确实减慢了速度.

另请参阅:将SQL文件导入mysql


dav*_*amm 3

您可以从 MySQL 命令行客户端创建备份,但不能从 SQL 查询中创建备份。您需要从 shell 执行该命令。我相信该execute资源可能会为您带来帮助:

http://wiki.opscode.com/display/chef/Resources#Resources-Execute

  • 您可以在命令行中包含密码。`mysql -u root -pSecret test_project &lt; import.sql` 不会提示输入密码(假设您的密码正确)。您必须在 Chef 脚本中包含密码,但对于 dev vagrant vm 配置,这不应该成为一个问题。 (2认同)