在厨师食谱中做一点 DRY 的最佳方法是什么?即只是打破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