2012-10-06 13 views
5

Basit bir jekyll tabanlı blogu dağıtmak için bir yemek kitabı geliştiriyorum. 'Uygulama' yemek kitabını temel olarak kullanıyorum. Şef, tanımlanmış geri aramalarımı görmezden gelerek her şey sorunsuz çalışır.Uygulama yemek kitabını kullanarak before_symlink geri arama nasıl tanımlanır?

Şef günlüğünde geri arama ile ilgili girdiler var, ancak hiçbir hata veya geri arama yürütme sonucu göremiyorum. ,

[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) 

Ben de geri arama dizesi kullanarak tanımlamaya çalıştı:

İşte
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 

şef-istemci callback'inde before_deploy yürütür diyor günlüğü: İşte

tarifleri/default.rb dosyasıdır ama sonuç aynı. Şef, geri arama tanımı olan bir dosya olmadığı zaman hata gösterir ve doğru yerde ise dosyayı yok sayar.

Güncelleme 1

Chef kaynaklardan içindeki derin kazma sonra geri aramaları ayrı şef koşucu yürütülen ve bu anında değil olur ki fark etti. Uygulamada yemek kodu, geri arama gövdesini değerlendirmek için _recipe_eval_ çağrılarını çağırdığında, Şef ayrı bir koşucu oluşturur ve kod, yöntemini arayana kadar yürütülmez.

Bu yüzden, uygulama yemek kitabını biraz değiştirdim. _recipe_eval_ 'den hemen sonra converge numaralı çağrıyı ekledim ve her şey çalışmaya başladı.

Bence bu bir hatadır ve resmi Opscode izleyicisinde bir sorun oluşturacağım. Ancak, herhangi bir yorum çok hoş geldiniz! İşte

application/kütüphaneler/default.rb sürümünü modifed edilir:

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 

cevap