2012-09-24 7 views
9

Gibt es eine Möglichkeit zu testen, dass eine bestimmte Kochbuchdatei in einem Kochrezept existiert? Ich möchte so etwas wie die folgenden Funktionen ausführen:Chef - Test für die Existenz von Kochbuchdateien

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
end 

und haben es nicht scheitern, wenn die Datei „etc/cron.d/{service_name}“ existiert nicht, da ich auf einer Maschine viele Dienste ausgeführt werden kann , aber nur einige von ihnen haben Cron-Jobs zugeordnet.

Ich will nicht eine große Liste von Diensten haben, die cron nehmen Jobs wie

['service_1', 'service_2', ...], 

da diese ziemlich spröde zu sein scheint. Idealerweise hätte ich gerne ein Verzeichnis, das Cron-Jobs für die Dienste enthält, die sie benötigen, und das Rezept schlägt nicht fehl, wenn diese Dateien nicht vorhanden sind. Ist das was ich suche möglich?

Antwort

6

Soweit ich weiß, ist es nicht möglich, einen Test durchzuführen, wenn die Kochbuchdatei existiert. Aber Sie können den Chef dazu bringen, den Lauf fortzusetzen anstatt zu versagen, wenn er die Datei nicht gefunden hat.

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
    ignore_failure true 
end 
+0

Das funktioniert gut genug für mich - danke! – Marc

+1

Es erzeugt jedoch trotzdem einen Fehler in den Protokollen. – timurb

0

Insgesamt würde ich empfehlen, das von @ JonathanM zur Verfügung gestellte answer zu verwenden.

Wenn Sie nicht auf eine chef_gem angewiesen sind, hier der Code, den Sie in Ihrem Rezept benötigen. Dieser Code wurde auf Chef 11.12.8 getestet, aber ich denke, es sollte mit jeder Chef 11.x Version funktionieren.

für ein cookbook_file 's Quelle:

only_if { run_context.has_cookbook_file_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

für eine template Um zu überprüfen,' Um zu überprüfen, s Quelle:

only_if { run_context.has_template_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

Die Variable cookbook_name in jedem Rezept implizit verfügbar ist und das aktuelle Kochbuch Name als Wert Um zu überprüfen, ob ein anderes Kochbuch eine Vorlage oder Datei enthält, ersetzen Sie cookbook_name durch eine fest codierte Zeichenfolge, z. B. "java".

Beachten Sie, dass das Abwechseln mit der internen API von Chef riskant ist, da der Code zwischen den Hauptversionen wechseln kann (selbst zwischen kleineren Versionen, denke ich). Deshalb ist die Verwendung von chef_gem eine gute Idee, das Juwel könnte mit mehreren Versionen von Chef umgehen, es reduziert visuelle Unordnung im Rezeptcode und macht den Code des Rezepts lesbarer, auch wenn das DSL gut gedacht ist.