厨师:如何在*收敛*而不是*编译*时间获得时间戳

chef: how to get a timestamp at *convergence* rather than *compile* time

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

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

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

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

所以我尝试了这个,但它没有用(消息发布到聊天时 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

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

不确定你试图解决什么问题,但你可以使用节点来存储时间戳。

node.normal[:cookbook_name][:deployment_time] = "undefined"
ruby_block "set-time-now" do
  block do
    node.normal[:cookbook_name][:deployment_time] = Time.new.strftime("%Y-%m-%d %H:%M:%S")
  end
end

unless Chef::Config[:solo]
  chat_message "Deployed #{artifact_name} #{node[:cookbook_name][:deployment_time]}"
end

你想要的是这样一个懒惰的求值器(我不知道你的 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

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