厨师:如何在ruby_block中要求ruby/mysqlAPI?
Chef: How to require ruby/mysql API in ruby_block?
我是 ruby 的新人,也是厨师。我成功地建立了一个厨师服务器和 bootstrap 个节点。我想通过我的食谱访问节点上的 Mysql 而没有 Mysql 和数据库食谱。我用了 ruby/mysql API。在单个 ruby 文件中编程时效果很好。代码如下
require "rubygems"
require "mysql"
begin
con = Mysql.new("localhost", "root", "123")
res = con.query("create database abc")
rescue Mysql::Error => e
puts e.errno
puts e.error
ensure
con.close if con
end
但是当我将此代码添加到我的食谱和 chef-client 中的 ruby_block 时,我在节点上遇到了错误。
================================================================================
Error executing action `run` on resource 'ruby_block[test1]'
================================================================================
LoadError
---------
cannot load such file -- mysql
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/db_test/recipes/default.rb:14:in `block (2 levels) in from_file'
Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/db_test/recipes/default.rb
11: ruby_block "test1" do
12: block do
13: require "rubygems"
14: require "mysql"
15:
16: begin
17: con = Mysql.new("localhost", "root", "123")
18: res = con.query("create database abc")
19: rescue Mysql::Error => e
20: puts e.errno
21: puts e.error
22: ensure
23: con.close if con
24: end
25: end
26: # action :run
Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/db_test/recipes/default.rb:11:in `from_file'
ruby_block("test1") do
action "run"
retries 0
retry_delay 2
default_guard_interpreter :default
block_name "test1"
declared_type :ruby_block
cookbook_name "db_test"
recipe_name "default"
block #<Proc:0x000000051907a8@/var/chef/cache/cookbooks/db_test/recipes/default.rb:12>
end
Running handlers:
[2015-04-07T22:14:12-04:00] ERROR: Running exception handlers
Running handlers complete
[2015-04-07T22:14:12-04:00] ERROR: Exception handlers complete
[2015-04-07T22:14:12-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 0 resources updated in 0.962999999 seconds
[2015-04-07T22:14:12-04:00] ERROR: ruby_block[test1] (db_test::default line 11) had an error: LoadError: cannot load such file -- mysql
[2015-04-07T22:14:12-04:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
我想不通问题出在什么时候。有人可以帮忙吗?
Chef 在其自己的 ruby 实例中运行(假设您已使用 omnibus 安装)。您需要使用 chef_gem 资源将 mysql gem 安装到 Chef ruby 中。那么你应该能够加载 mysql ruby
在块的顶部添加 chef_gem "mysql2"
到 require 语句之前。
我是 ruby 的新人,也是厨师。我成功地建立了一个厨师服务器和 bootstrap 个节点。我想通过我的食谱访问节点上的 Mysql 而没有 Mysql 和数据库食谱。我用了 ruby/mysql API。在单个 ruby 文件中编程时效果很好。代码如下
require "rubygems"
require "mysql"
begin
con = Mysql.new("localhost", "root", "123")
res = con.query("create database abc")
rescue Mysql::Error => e
puts e.errno
puts e.error
ensure
con.close if con
end
但是当我将此代码添加到我的食谱和 chef-client 中的 ruby_block 时,我在节点上遇到了错误。
================================================================================
Error executing action `run` on resource 'ruby_block[test1]'
================================================================================
LoadError
---------
cannot load such file -- mysql
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/db_test/recipes/default.rb:14:in `block (2 levels) in from_file'
Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/db_test/recipes/default.rb
11: ruby_block "test1" do
12: block do
13: require "rubygems"
14: require "mysql"
15:
16: begin
17: con = Mysql.new("localhost", "root", "123")
18: res = con.query("create database abc")
19: rescue Mysql::Error => e
20: puts e.errno
21: puts e.error
22: ensure
23: con.close if con
24: end
25: end
26: # action :run
Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/db_test/recipes/default.rb:11:in `from_file'
ruby_block("test1") do
action "run"
retries 0
retry_delay 2
default_guard_interpreter :default
block_name "test1"
declared_type :ruby_block
cookbook_name "db_test"
recipe_name "default"
block #<Proc:0x000000051907a8@/var/chef/cache/cookbooks/db_test/recipes/default.rb:12>
end
Running handlers:
[2015-04-07T22:14:12-04:00] ERROR: Running exception handlers
Running handlers complete
[2015-04-07T22:14:12-04:00] ERROR: Exception handlers complete
[2015-04-07T22:14:12-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 0 resources updated in 0.962999999 seconds
[2015-04-07T22:14:12-04:00] ERROR: ruby_block[test1] (db_test::default line 11) had an error: LoadError: cannot load such file -- mysql
[2015-04-07T22:14:12-04:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
我想不通问题出在什么时候。有人可以帮忙吗?
Chef 在其自己的 ruby 实例中运行(假设您已使用 omnibus 安装)。您需要使用 chef_gem 资源将 mysql gem 安装到 Chef ruby 中。那么你应该能够加载 mysql ruby
在块的顶部添加 chef_gem "mysql2"
到 require 语句之前。