Chef - Vorlage mit dynamischer Variable erstellen?

8

Ich habe ein kleines Problem mit einem Chefrezept. Ich bin neu bei Chef, also bitte ertragen Sie mit mir.

Schritt 1: Mein Kochrezept installiert Ruby Passenger und kompiliert das Passenger-nginx-Modul zusammen mit Nginx.

%Vor%

Schritt 2: Danach erstelle ich die Nginx-Konfigurationsdatei mit einer Vorlage. Diese Konfiguration erfordert den Standort von Passenger, der von Schritt 1 abhängig ist.

%Vor%

Problem: Chef scheint Vorlagen zu Beginn des Laufs zu kompilieren. Was letztendlich passiert, ist, dass Schritt 2 tatsächlich kompiliert wird, bevor Schritt 1 ausgeführt wird. Dies bedeutet, dass die Variable Passagier_Root leer ist. Es muss Schritt 1 abgeschlossen sein, bevor das Fluggaststammverzeichnis abgerufen werden kann. Führen Sie dann die Vorlage aus.

Ich habe versucht, den Step-2-Code in ruby_block einzufügen, aber das funktioniert nicht: undefined method template 'für Chef :: Resource :: RubyBlock'.

Sie wissen nicht, was Sie hier tun sollen oder was ist die beste Vorgehensweise für Chefkoch für so etwas?

Vielen Dank im Voraus,

Leonard

    
Leonard Teo 01.04.2013, 12:32
quelle

3 Antworten

11

Eine sauberere und empfohlene Methode ist Lazy Attribute Evaluation .

%Vor%

Außerdem würde ich vorschlagen, strip anstelle von chomp [danke, Draco] zu benutzen.

    
Greg 20.11.2013 00:24
quelle
3

Sobald Sie Ihren Code in ruby_block einfügen, können Sie die Deklaration der normalen Rezepturressource nicht mehr verwenden. Sie müssen reinen Ruby-Code schreiben:

%Vor%

PS. Und ich denke, dass Sie strip anstelle von chomp verwenden möchten, um Leerzeichen zu entfernen.

    
Draco Ater 03.04.2013 14:26
quelle
1

Ja, Chef ist ein Biest. Ich denke, ein Teil des Problems besteht darin, dass es eine Million Möglichkeiten gibt, die gleichen Dinge zu tun, aber es gibt wirklich keine Dokumentation, die den besten Weg beschreibt. Wahrscheinlich möchten Sie Benachrichtigungen verwenden, damit Block 1 zuerst ausgeführt wird, bevor Block 2 benachrichtigt wird. Dies bedeutet, dass Block 2 action :none benötigt, damit er erst ausgelöst wird, wenn er benachrichtigt wird.

Ich habe die Benachrichtigung zu Ihrem Beispiel in Block 1 hinzugefügt und die Aktion: none to block 2 hinzugefügt.

%Vor%     
mguymon 01.04.2013 13:16
quelle

Tags und Links