Cách tốt nhất để thực hiện một chút DRY trong công thức nấu ăn là gì? I E. chỉ cần tách ra các bit nhỏ của mã Ruby, vì vậy tôi không sao chép dán nó nhiều lần.DRY trong công thức Chef
Sau đây thất bại tất nhiên, với:
NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock
Tôi có thể có nhiều ruby_blocks trong một công thức, khi họ làm những việc khác nhau và cần phải có khác nhau not_if khối để được truley idempotent.
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
Tôi đã không thử nó, nhưng nó là một câu trả lời hoàn chỉnh, ví dụ. Cảm ơn! Tôi rất buồn khi thấy rằng tôi phải tạo ra một thư viện nấu ăn đầu bếp cho một chức năng nhỏ mà sẽ không được sử dụng ở bất cứ nơi nào khác. Nhưng bất cứ điều gì. – DragonFax
Nếu bạn muốn sử dụng các phương thức thể hiện, do đó bạn không cần phải thêm tiền tố bằng tên lớp, bạn chỉ cần thực hiện ':: Chef :: Recipe.send (: include, MysqlHelper)' và sau đó bạn có thể gọi 'connect_root 'trực tiếp. –
Cảm ơn bạn @JohnMorales. Câu trả lời được chấp nhận là hoàn hảo, tuy nhiên dòng bạn thêm vào (hiển thị bên dưới) đã làm việc để hoàn thành: :: Chef :: Recipe.send (: include, MysqlHelper) – KLaw