厨师:为什么我不读刚设置的属性值?

时间:2018-07-23 21:50:38

标签: ruby chef chef-recipe

在我的工作中,我被厨师弄湿了,并被要求安装制作配方以使用自定义配置在我们的机器上安装Telegraf。我也要以我没有红宝石的经验作为开头。

在下载或安装telegraf之前,我想验证是否存在telegraf,以便在版本不匹配时仅执行以下所有工作。

因此,我试图在配方运行时设置一个其他资源将要检查的属性。

ruby_block 'get telegraf version' do
  block do
      #tricky way to load this Chef::Mixin::ShellOut utilities
      Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)
      command = 'C:\\Program Files\\telegraf\\telegraf.exe --version'
      command_out = shell_out(command)
      node.default['windows']['telegraf']['installed_version'] = 'good'
  end
  notifies :write, 'log[log_version]', :delayed
  action :run
  only_if { ::File.exists?('C:\\Program Files\\telegraf\\telegraf.exe')}
end

log 'log_version' do
    message node['windows']['telegraf']['installed_version']
    level :error
end

尽管看到输出,我仍然看到

     * ruby_block[get telegraf version] action run[2018-07-23T14:48:11-07:00] INFO: Processing ruby_block[get telegraf version] action run (win-telegraf::telegraf line 26)
   [2018-07-23T14:48:11-07:00] INFO: ruby_block[get telegraf version] called

       - execute the ruby block get telegraf version
     * log[log_version] action write[2018-07-23T14:48:11-07:00] INFO: Processing log[log_version] action write (win-telegraf::telegraf line 39)
   [2018-07-23T14:48:11-07:00] ERROR:

那么当我读到node['windows']['telegraf']['installed_version']时,为什么日志什么也不打印,而不是“好”?

1 个答案:

答案 0 :(得分:1)

主厨使用两遍加载系统,请查看https://coderanger.net/two-pass/了解更多详细信息。但是这种情况下的tl; dr是block do ... end中的内容在第二阶段运行,而log资源的Ruby代码在第一阶段进行评估。通常,您可以使用lazy{}帮助程序来解决此问题,但是在这种情况下,您可能想要的是自定义资源或Ohai插件。对于“普通” Windows应用程序,这全部由MSI子系统和windows_package资源处理,但是由于Telegraf不提供MSI软件包,因此您有点不走运。也就是说,有可用于Chocolatey(Windows打包系统,如Mac的Homebrew)的软件包,因此您可能希望研究使用该软件包,而不是自己编写。