7

我有一个厨师食谱,看起来像:

Chef::Log.info('step1')
# do stuff

Chef::Log.info('step2')
bash "do_wget" do
  code <<-EOF
  wget somefile
  EOF
end

Chef::Log.info('step3')
# do stuff

wget 需要一段时间,但日志记录最终看起来像

step1    
step2    
step3
bash script runs #indicates that the bash script from step 2 is running

有没有办法阻止从第 3 步开始记录,直到 bash 脚本执行完毕?

4

2 回答 2

8

您应该熟悉Chef Run 的解剖学。它有两个阶段:编译和执行。

在编译阶段不对配方中的资源采取任何行动——每个评估的资源都只是被采取并放入资源集合中。但是,评估资源之外的纯 Ruby 代码。

在执行阶段,它实际上评估Resource Collection。但是此时您所有的日志消息都已经打印出来了。

如果您需要在执行阶段运行 ruby​​ 代码(包括 Chef 日志记录),该Ruby 块有一个特殊资源

ruby_block "Add logging step3" do
  block do
    Chef::Log.info('step3')
  end
  action :create
end

另一种方法可能是,在编译阶段实际执行资源:

bash "do_wget" do
  code "wget somefile"
  action :nothing
end.run_action :run

Action :nothing 设置为避免运行此资源两次(每个阶段一次)。

于 2012-09-26T08:52:29.397 回答
3

您可以改用日志资源,据我所知,它会根据您的需要在执行阶段运行

log "step2" do
    :info
end

或者干脆

log "step 3"

http://docs.opscode.com/resource_log.html

于 2013-09-10T03:19:09.163 回答