chef には Compile フェーズ -> Convergence フェーズ -> Notification フェーズ、というものがあって、Notification フェーズよりも後、最後の最後にリソースを実行したい、と思ってもなかなか難しい。
そんななか、1つ方法を見つけたのでメモ。黒魔術
1. Chef::Handler を使う
Chef::Handler という仕組みがあって、chef 実行が終わったらレポートを出力するのに使える機能がある。これを悪用する。
レシピをこんなかんじに書く
recipes/default.rb
require 'chef/handler'
class Chef::Handler::Finalizer < Chef::Handler
def initialize(recipe)
@recipe = recipe
end
def report
@recipe.log "final log" do
message "This message is shown in last!!"
end.run_action(:write)
end
end
Chef::Config[:report_handlers] << Chef::Handler::Finalizer.new(self)
# あとはなにか普通のを書く
directory "/tmp/foo" do
end
report メソッドの中でリソースを直実行している。
おわりに
良い子の皆は真似しないでね