2012-12-10 3 views
5

Ich versuche über den chef_handler lwrp einen Kochhandler zu installieren. Dieser Handler (Chef-Handler-Email) kommt gebündelt in einem Juwel. Ich versuche, den Edelstein dann auf dem Handler aus einem einzigen Rezepte drehen zu installieren, die wie folgt aussieht:Wie installiere ich Abhängigkeiten für einen Chef-Handler?

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) 

Dies funktioniert gut, wenn der Edelstein ist bereits installiert. Wenn jedoch die Gem noch nicht installiert ist erhalte ich diesen Fehler:

[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 

Es scheint, als ob die chef_handler Ressource versucht, den Handler zu laden, bevor chef_gem ausgeführt hat und den Edelstein für den Handler installiert. Ich kann dies natürlich in einem zweistufigen manuellen Prozess tun, in dem ich ein separates Rezept für die Installation des Edelsteins habe, und dann zu einem anderen Rezept umschalten, das den Handler konfiguriert, aber ich hoffe, mehrstufige manuelle Prozesse zu vermeiden. Kann es über ein einzelnes Rezept getan werden?

Antwort

2

Ich habe ein ähnliches Rezept für Koch Minitest-Koch-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) 

Versuchen Sie Ihr Juwel erfordern, bevor chef_handler Ressource erstellen oder Quelle sollte anders sein kann ...

+0

Dies ist die richtige Antwort. – sethvargo

-1

Der #run_action Aufruf bewirkt, dass die Ressource chef_handler sofort in der Phase "Kompilieren" ausgeführt wird, während die Ressource chef_gem während der Phase "execute" wie normal ausgeführt wird.

Also auch das Juwel muss in der Kompilierphase installiert werden. Und es scheint, dass eine Anweisung benötigt wird (wie in einer anderen Antwort vorgeschlagen), damit Chef den Edelstein lädt.

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

Das ist nicht wahr. Die Ressource 'chef_gem' wird immer in der Kompilierungsphase ausgeführt. – sethvargo