[英]MySQL not working when running PHP script from Chef Recipe in Vagrant
[英]Importing Mysql database using Ruby/Chef Recipe for 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
我希望我能夠執行以下查詢#m.query("-u root -p root db_name < /project/db/import.sql")
但只是給了我一個錯誤。
我沒有做太多的Ruby,所以很難弄明白。 誰知道我怎么能這樣做?
如果它是文件路徑錯誤,並且您正在使用chef solo,請嘗試使用solo.rb中指定的路徑,如:
/tmp/chef-solo/site-cookbooks/path_to_file.sql
作為一般說明,考慮使用數據庫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
沒有測試過最后一個,因為在chef目錄中存儲數據庫文件確實減慢了速度。
另請參閱:將SQL文件導入mysql
您可以從MySQL命令行客戶端創建備份,但不能從SQL查詢中創建備份。 您需要從shell執行命令。 我相信execute
資源可能會為您解決問題:
http://wiki.opscode.com/display/chef/Resources#Resources-Execute
我不是一個真正的Ruby人,但我設法讓Chef通過利用mysql
命令行工具導入一個大的.sql
文件。 我需要解決的挑戰:
.sql
文件(如果需要GB或TB,則為YMMV) .sql
文件發生更改時才運行導入 首先,我創建了一個.my.cnf
文件模板來傳遞憑據:
[client]
host=<%= @host %>
user=<%= @user %>
password="<%= @password %>"
然后我在我的配方中添加了一個資源來填充模板:
template '/root/.my.cnf' do
mode 0600
variables({
:host => 'localhost',
:user => 'root',
:password => node[:your_cookbook][:db][:root_password],
})
end
(其中node[:your_cookbook][:db][:root_password]
是包含MySQL root密碼的屬性)
安全注意 :為簡單起見,我以root
用戶身份進行導入。 如果要導入的.sql
文件不是來自受信任的源,則需要以受限用戶身份運行mysql
,並使用只能訪問相關數據庫的有限db用戶連接到MySQL。
最后,我在實際執行導入的配方中添加了另一個資源:
backup_sql = '/path/to/the/db-backup.sql'
db_last_modified = "/etc/db-#{node[:your_cookbook][:db][:name]}.lastmodified"
execute 'restore backup' do
command "mysql #{node[:your_cookbook][:db][:name]} <'#{backup_sql}' && touch '#{db_last_modified}'"
not_if { FileUtils.uptodate?(db_last_modified, [backup_sql]) }
end
(其中node[:your_cookbook][:db][:name]
是要恢復的MySQL數據庫的名稱。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.