Qual è il modo migliore per fare un po 'secco all'interno di una ricetta cuoco? Cioè basta scovare piccoli frammenti del codice Ruby, quindi non lo copro più e più volte.DRY all'interno di una ricetta Chef
Di seguito fallisce naturalmente, con:
NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock
io possa avere più ruby_blocks in una ricetta, come fanno cose diverse e bisogno di avere diversi not_if blocchi per essere idempotente Truley.
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
non ho provato, ma la sua una risposta completa, con l'esempio. Grazie! Sono triste nel vedere che devo creare un'intera libreria di libri di cucina per chef per una piccola funzione che non verrà utilizzata da nessun'altra parte. Ma comunque. – DragonFax
Se si desidera utilizzare i metodi di istanza in modo da non dover prefisso con il nome della classe, si dovrebbe solo fare ':: :: Chef Recipe.send (: include, MysqlHelper)' e poi si può solo chiamare 'connect_root 'direttamente. –
Grazie @JohnMorales. La risposta accettata è stata perfetta, ma la linea si è aggiunto (vedi sotto) ottenuto lavorando a compimento: :: :: Chef Recipe.send (: include, MysqlHelper) – KLaw