2017-10-24 2 views
0

Hintergrund: Unsere Systeme sind so eingerichtet, dass ich nur das lokale Kochprotokoll sehen kann und keinen Zugriff auf die Chef-Serverkonsole oder andere Systemadministratorberechtigungen haben werde. Daher muss ich lokal loggen, wenn ich sehen möchte, ob oder warum etwas fehlgeschlagen ist.Chef - Installationsblock ausführen, basierend auf variablen Bedingungen

Ich kann Sie fragen hören "Wenn Sie dem Pkg oder Chef nicht vertrauen, es richtig zu installieren, dann ..." Meine Antwort ist, dass, während Sie richtig sind, ich immer noch durch die gelegentliche Anomalie abgedeckt werden soll.

Mein Ziel ist es, ein Paket zu installieren, zu überprüfen, ob es korrekt installiert ist, als weiter zum nächsten Paket.

Auf die Frage:

Ich mag eine Variable setzen, die für die Existenz eines Verzeichnisses überprüft, die durch das erste Paket mit dem folgenden Code erstellt wurde:

mycond = ::File.directory?('/opt/MyPkg/conf') 
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

die nächste Stufe In dem Rezept wird der nächste Installationsblock überprüft, um zu sehen, ob die Variable gesetzt wurde.

yum_package 'OtherPkg' do 
    action :install 
    only_if { mycond } 
end 

Meine Frage ist, da die only_if ausfällt, ich frage mich, ob es etwas falsch mit der Art und Weise war ich die Einstellung der mycond Variable? Perhapes {} Klammern werden irgendwo im Code benötigt?

Total Chef Neuling also bitte genau mit Ihrer Antwort.

Danke!

Voll Code unten:

yum_package 'MyPkg' do 
     flush_cache [ :before ] 
     action :install 
    end 

    mycond = ::File.directory?('/opt/MyPkg/conf') 
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

    yum_package 'OtherPkg' do 
     action :install 
     only_if { mycond } 
    end 

Antwort

2

Das Problem ist Chefs Zwei-Pass-Modell. Für eine vollständige Erklärung siehe https://coderanger.net/two-pass/. Sie müssen nur die Bedingungsprüfung in den Block only_if selbst verschieben, da dieser bis zur Konvergenzzeit verzögert ist: only_if { ::File.directory?('/opt/MyPkg/conf') }.

Die Verwendung der fatal Log-Ebene ist auch wahrscheinlich keine gute Idee, da dies nicht wirklich ein fataler Fehler ist, wie geschrieben.

+0

Wie kann ich es auch in das lokale Protokoll schreiben? – eramm

+0

Ich würde wahrscheinlich eine Protokoll-Ressource dafür verwenden. – coderanger

2

Chef hat einen Auftrag von precidance, die den Fluss der Ausführung steuert.

Code innerhalb von Ressourcenblöcken (z. B. "yum_package") wird NACH jedem beliebigen lockeren Code in Ihrem Rezept ausgeführt.

Die folgenden Zeilen werden zuerst ausgeführt, bevor Sie Ihren ‚yum_package‘ Blöcke:

mycond = ::File.directory?('/opt/MyPkg/conf') 
Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

Ich glaube, können Sie Ressourcenblöcke Nest. Du bist in der Lage, all diesen Code in einem 'ruby_block' zu kombinieren und er sollte in der richtigen Reihenfolge ausgeführt werden.

+0

und eine in einem Ruby-Block gesetzte Variable wird im nächsten Installationsblock beibehalten/verfügbar? – eramm

+0

Ich konnte keine Dokumentation zu verschachtelten Blöcken finden, aber Sie haben die Ursache richtig erkannt. – eramm

Verwandte Themen