Sto sviluppando un libro di cucina per distribuire un semplice blog basato su jekyll. Uso il ricettario "applicazione" come base. Tutto funziona senza intoppi tranne che lo chef ignora semplicemente i miei callback definiti.Come definire il callback before_symlink utilizzando il ricettario dell'applicazione?
Il registro dello chef contiene voci sulla mia richiamata, ma non vedo errori o esiti dell'esecuzione di callback.
Ecco file di ricette/default.rb:
include_recipe "git"
application "example_com" do
path "/var/www/example.com"
repository "[email protected]:xxx/xxx.git"
revision "master"
deploy_key <<EOF
-----BEGIN RSA PRIVATE KEY-----
..skip...
-----END RSA PRIVATE KEY-----
EOF
# before_symlink "script/bootstrap"
before_deploy do
# raise
# Chef::Log.info("INSANE!")
execute "bundle exec rake generate" do
cwd release_path
end
end
end
Ecco il registro dove lo chef-cliente dice esegue before_deploy callback:
[2012-10-06T10:06:20-04:00] INFO: Processing ruby_block[example_com before_deploy] action create (/var/cache/chef/cookbooks/application/providers/default.rb line 107)
[2012-10-06T10:06:20-04:00] DEBUG: Got callback before_deploy: #<Proc:[email protected]/var/cache/chef/cookbooks/example_com/recipes/default.rb:24>
[2012-10-06T10:06:20-04:00] INFO: application[example_com] running callback before_deploy
[2012-10-06T10:06:20-04:00] INFO: ruby_block[example_com before_deploy] called
[2012-10-06T10:06:20-04:00] INFO: Processing deploy_revision[example_com] action deploy (/var/cache/chef/cookbooks/application/providers/default.rb line 122)
Ho anche cercato di definire richiamata tramite stringa, ma il risultato è lo stesso. Lo chef mostra un errore quando non ci sono file con la definizione di callback e semplicemente ignora il file se è nel posto giusto.
Update 1
Dopo aver scavato più in profondità le fonti Chef mi sono reso conto che le richiamate vengono eseguite in corridore cuoco separato e questo non avviene istantaneamente. Quando il codice nel libro di cucina applicazione chiama _recipe_eval_ per valutare callback Chef corpo crea corridore separata e il codice non eseguito fino a quando qualcosa chiamata convergono metodo.
Così, ho modificato l'applicazione libro di cucina un po '. Ho aggiunto la chiamata converge subito dopo _recipe_eval_ e tutto ha iniziato a funzionare.
Penso che questo sia un bug e sto per creare un problema nel tracker Opscode ufficiale. Tuttavia, qualsiasi commento è molto gradito!
Qui è modifed versione dell'applicazione/librerie/default.rb:
class Chef
class Provider
module ApplicationBase
# ...skip...
def callback(what, callback_code=nil)
Chef::Log.debug("Got callback #{what}: #{callback_code.inspect}")
@collection = Chef::ResourceCollection.new
case callback_code
when Proc
Chef::Log.info "#{@new_resource} running callback #{what}"
# recipe_eval(&callback_code)
recipe_eval(&callback_code)
converge # <--- Remove this line and no callbacks will work.
when String
callback_file = "#{release_path}/#{callback_code}"
unless ::File.exist?(callback_file)
raise RuntimeError, "Can't find your callback file #{callback_file}"
end
run_callback_from_file(callback_file)
when nil
nil
else
raise RuntimeError, "You gave me a callback I don't know what to do with: #{callback_code.inspect}"
end
end
end
end
end