5

シンプルな jekyll ベースのブログを展開するクックブックを開発しています。「アプリケーション」クックブックをベースに使用しています。シェフが定義したコールバックを単に無視することを除いて、すべてがスムーズに機能します。

Chef ログにはコールバックに関するエントリが含まれていますが、コールバック実行のエラーや結果は表示されません。

これがレシピ/default.rbファイルです:

include_recipe "git"

application "example_com" do
  path "/var/www/example.com"
  repository "git@example.org: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

これは、chef-client が before_deploy コールバックを実行すると言うログです。

[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:0x00007f0509788088@/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)

また、文字列を使用してコールバックを定義しようとしましたが、結果は同じです。Chef は、コールバックが定義されたファイルがない場合にエラーを表示し、適切な場所にある場合は単にファイルを無視します。

更新 1

Chef のソースを深く掘り下げた後、コールバックは別の Chef Runner で実行され、これはすぐには行われないことに気付きました。アプリケーションクックブックのコードが _recipe_eval_ を呼び出してコールバック本体を評価すると、Chef は別のランナーを作成し、何かが収束メソッドを呼び出すまでコードは実行されません。

そこで、アプリケーションのクックブックを少し修正しました。_recipe_eval_ の直後にcall convergeを追加すると、すべてが機能し始めました。

これはバグだと思います。公式の Opscode トラッカーで問題を作成します。ただし、コメントは大歓迎です!

application/libraries/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
4

1 に答える 1

1

Opscodeは、それがChefのバグであることを確認しました。誰かが修正の詳細とステータスを必要とする場合は、次のリンクを使用してください。

于 2012-11-01T06:29:43.133 に答える