Chef:如何在*收敛*而不是*编译*时获取时间戳

vik*_*eve 3 ruby date chef-infra convergence chatops

请考虑我的食谱末尾的这段代码deploy_to_tomcat

  unless Chef::Config[:solo]
    chat_message "Deployed #{artifact_name} `#{Time.new.strftime("%Y-%m-%d %H:%M")}`"
  end
Run Code Online (Sandbox Code Playgroud)

它发布一条消息进行聊天:部署了 my-web-app 2016-11-03 12:31

但是,我注意到时间戳有点Time.new过时 - 它似乎是编译配方时的时间戳而不是几分钟后资源覆盖并运行时的时间戳。

所以我尝试了这个,但它不起作用(timeNow 仍然是undefined发布消息聊天时的时间)

  timeNow = "undefined"
  ruby_block "set-time-now" do
    block do
      timeNow = Time.new.strftime("%Y-%m-%d %H:%M:%S")
    end
  end

  unless Chef::Config[:solo]
    chat_message "Deployed #{artifact_name} `#{timeNow}`"
  end
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法让我的时间戳反映实际时间(而不是食谱开始时)?

cod*_*ger 7

你想要的是一个像这样的惰性评估器(不管怎样,我不知道你的chat_message资源是如何编写的):

unless Chef::Config[:solo]
  chat_message "deployed" do
    message lazy { "Deployed #{artifact_name} `#{Time.new.strftime("%Y-%m-%d %H:%M")}`" }
  end
end
Run Code Online (Sandbox Code Playgroud)

这将延迟消息字符串的评估,直到收敛时间。