2012-12-10 25 views
5

Tôi đang cố gắng cài đặt một trình xử lý đầu bếp thông qua lwrp chef_handler. Điều này xử lý (đầu bếp-handler-email) đi kèm trong một viên ngọc. Tôi đang cố gắng để cài đặt đá quý sau đó bật trình xử lý từ trong một công thức duy nhất trông giống như:Làm cách nào để cài đặt các phụ thuộc cho trình xử lý đầu bếp?

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) 

Điều này làm việc tốt nếu đá quý đã được cài đặt. Tuy nhiên, nếu các Gem chưa được cài đặt tôi nhận được lỗi này:

[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 

Có vẻ như tài nguyên chef_handler đang cố gắng tải xử lý trước khi chef_gem đã thực hiện và cài đặt các viên ngọc cho xử lý. Tôi rõ ràng có thể làm điều này trong quy trình thủ công hai bước, nơi tôi có một công thức riêng để cài đặt đá quý, sau đó lật sang một công thức khác có cấu hình trình xử lý, nhưng tôi hy vọng tránh được các quy trình thủ công nhiều bước. Nó có thể được thực hiện thông qua công thức duy nhất?

Trả lời

2

Tôi có một công thức tương tự cho đầu bếp minitest-bếp-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) 

Hãy thử yêu cầu đá quý của bạn trước khi tạo tài nguyên chef_handler, hoặc có thể là nguồn nên khác nhau ...

+0

Đây là câu trả lời đúng. – sethvargo

-1

Các #run_action cuộc gọi làm cho tài nguyên chef_handler được chạy ngay lập tức ở giai đoạn "biên dịch" trong khi tài nguyên chef_gem được chạy trong giai đoạn "thực thi" như bình thường.

Vì vậy, cũng cần phải cài đặt đá quý ở giai đoạn biên dịch. Và có vẻ như câu lệnh require cũng cần thiết (như được đề xuất trong câu trả lời khác) cho Đầu bếp để tải đá quý.

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) 
+0

Điều này không đúng. Tài nguyên 'chef_gem' luôn thực hiện trong giai đoạn biên dịch. – sethvargo

Các vấn đề liên quan