【问题标题】:How do I install dependencies for a chef handler?如何为厨师处理程序安装依赖项?
【发布时间】:2013-07-10 05:42:36
【问题描述】:

我正在尝试通过 chef_handler lwrp 安装厨师处理程序。这个处理程序(chef-handler-email)捆绑在一个 gem 中。我正在尝试安装 gem,然后从单个配方中打开处理程序,如下所示:

chef_gem "chef-handler-mail"

chef_handler "MailHandler" do
  source 'chef/handler/mail'
  arguments :to_address => "root"
  action :nothing
  supports :exception => true, :report => false
end.run_action(:enable)

如果 gem 已经安装,这可以正常工作。但是,如果尚未安装 Gem,我会收到此错误:

[2012-12-09T20:47:56-05:00] FATAL: LoadError: chef_handler[MailHandler] (chef_handler::email line 13) had an error: LoadError: no such file to load -- chef/handler/mail.rb

在 chef_gem 执行并为处理程序安装 gem 之前,似乎 chef_handler 资源正在尝试加载处理程序。我显然可以在两步手动过程中执行此操作,其中我有一个单独的安装 gem 的配方,然后翻转到另一个配置处理程序的配方,但我希望避免多步手动过程。可以通过单一配方完成吗?

【问题讨论】:

    标签: ruby chef-infra chef-recipe


    【解决方案1】:

    我有一个类似的厨师 minitest-chef-handler 食谱:

    chef_gem 'minitest'
    chef_gem 'minitest-chef-handler'
    
    require 'rubygems'
    require 'minitest-chef-handler'
    
    [... some unrelated code ...]
    
    chef_handler "MiniTest::Chef::Handler" do
        source "minitest-chef-handler"
        arguments :verbose => true
        action :nothing
    end.run_action( :enable )
    

    在创建 chef_handler 资源之前尝试要求您的 gem,或者可能是源应该不同...

    【讨论】:

      【解决方案2】:

      #run_action 调用导致chef_handler 资源在“编译”阶段立即运行,而chef_gem 资源在“执行”阶段正常运行。

      因此,gem 也需要在编译阶段安装。并且似乎还需要 require 语句(如另一个答案中所建议的那样),以便 Chef 加载 gem。

      chef_gem 'chef-handler-mail' do
        action :nothing
      end.run_action(:install)
      
      require 'chef/handler/mail'
      
      chef_handler 'MailHandler' do
        source 'chef/handler/mail'
        # ... other attributes
        action :nothing
      end.run_action(:enable)
      

      【讨论】:

      • 这不是真的。 chef_gem 资源始终在编译阶段执行。
      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 2019-08-03
      • 2012-03-30
      • 2012-01-26
      • 2015-05-28
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      相关资源
      最近更新 更多