【发布时间】:2013-03-24 04:25:36
【问题描述】:
在厨师食谱中做一点 DRY 的最佳方法是什么? IE。只需分解一点点 Ruby 代码,所以我不会一遍又一遍地复制粘贴它。
以下当然失败了:
NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock
我可能在一个配方中有多个 ruby_blocks,因为它们做不同的事情并且需要有不同的 not_if 块才能真正实现幂等。
def connect_root(root_password)
m = Mysql.new("localhost", "root", root_password)
begin
yield m
ensure
m.close
end
end
ruby_block "set readonly" do
block do
connect_root node[:mysql][:server_root_password] do |connection|
command = 'SET GLOBAL read_only = ON'
Chef::Log.info "#{command}"
connection.query(command)
end
end
not_if do
ro = nil
connect_root node[:mysql][:server_root_password] do |connection|
connection.query("SELECT @@read_only as ro") {|r| r.each_hash {|h|
ro = h['ro']
} }
end
ro
end
end
【问题讨论】:
标签: ruby chef-infra chef-recipe