シェフのレシピで少し DRY を行う最良の方法は何ですか? つまり、Ruby コードのほんの一部を分割するだけなので、何度もコピーして貼り付けるわけではありません。
もちろん、次の場合は失敗します。
NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock
1 つのレシピに複数の ruby_block を含めることができます。それらは異なることを行い、真の冪等性を持たせるには異なる 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