2016-07-07 19 views
2

Ich habe gerade angefangen, Chef zu verwenden, und ich versuche herauszufinden, wie man zuerst überprüft, ob eine Datei existiert, bevor Sie etwas tun.Chef-Rezept So überprüfen Sie, ob die Datei existiert

Ich habe die Teil-Datei für meinen aktuellen Anwendungsfall nach unten, wo ich eine Login-Datei für den Produktionsserver bin zu entfernen, ex:

file '/var/www/html/login.php' do 
    action :delete 
end 

Allerdings habe ich die abilty möchte zuerst zu prüfen, ob die Datei existiert z.

if (file_exists === true) 
    file '/var/www/html/login.php' do 
     action :delete 
    end 
end 
+0

Warum brauchen Sie diese Fähigkeit? Prüft Chef nicht, ob der gewünschte Status des Systems dem von Ihnen beschriebenen Status entspricht, und ändert er nur Änderungen, wenn der gewünschte Status unterschiedlich ist? Welches aktuelle Problem oder welche Fehlermeldung versuchen Sie gerade zu lösen? –

+0

Hey @DavidGrayson danke für die Antwort. Ich bin neu bei Chefkoch, also magst du recht in deinem Denken sein. Ich bekomme derzeit keine Fehler oder Probleme, aber ich bin es so gewohnt, bedingte Aussagen zu schreiben, dass es das Richtige zu tun schien - das könnte ein Fehler in meinem Denken sein, da ich immer noch Best Practices kenne wie Chef arbeitet. Muss ich in diesem Fall nicht prüfen, ob eine Datei existiert? Bedeutet, dass ich keinen Fehler bekommen werde, wenn die Datei nicht existiert und ich noch ein Rezept ausführe, das versucht, es zu löschen? – Corey

+0

Normalerweise lösche ich Dateien nicht mit Chef, aber ich weiß, dass ich beim Erstellen keine "if" -Anweisungen benötige, daher sehe ich nicht, warum man beim Löschen eine "if" -Anweisung benötigt. –

Antwort

7

Wie in den Kommentaren erwähnt, für eine Streichung Aktion ist die if Anweisung unnötig, wie erwähnt, denn wenn Koch gelöscht wird die Datei nicht findet, wird es annehmen, dass es bereits gelöscht wurde.

Andernfalls möchten Sie normalerweise guard properties in der Ressource (für alle Ressourcen verfügbar) verwenden, anstatt eine Ressource in ein if-then zu verpacken.

file '/var/www/html/login.php' do 
    only_if { ::File.exist?('/var/www/html/login.php') } 
    action :touch 
end 

Und Sie wollen wahrscheinlich auch mit the Ruby File class methods sich vertraut zu machen.

+0

Danke Karen, das ist sehr hilfreich. – Corey

+0

Dies ist redundant, wie unten erwähnt. Die Ressource 'file' tut bereits nichts für die Aktion': delete', wenn die Datei nicht existiert. – coderanger

2

Die Grundidee von Chef besteht darin, dass Sie den gewünschten Status des Systems angeben. Dann vergleicht Chef dies mit dem tatsächlichen Status und nimmt alle erforderlichen Änderungen vor, um das System in den gewünschten Status zu versetzen. Sie müssen keine if-Anweisung haben, um zu überprüfen, ob die Datei existiert, bevor Sie sie löschen. Chef selbst sollte prüfen, ob die Datei existiert, wenn ich mich nicht irre.

+0

Danke für die Klarstellung. Es scheint, dass ich meine Denkweise in Richtung der Tatsache, dass Chef eine deklarative Beschreibung für den Staat ist, in dem Sie Ihre Infrastruktur sein möchten, verschieben sollte, so ist dies eine große Erinnerung. – Corey

Verwandte Themen