Wir haben eine Situation mit Mapr-Client-Installation. Wir möchten in der Lage sein, eine benutzerdefinierte Datei hive-site.xml zu kopieren, die sich unter /opt/mapr/hive/hive-x.y/conf/ dir befindet. Das Problem ist, dass wir die Versionsnummer des Hives erst dann kennen würden, wenn eine Reihe von Paketen (einschließlich der Hive) vollständig installiert ist. Also, Code wie folgt ausfällt:Chef: Lazy Auswertung von Variablen-Argument
package 'mapr-client'
...
...
dir_hive = Dir["/opt/mapr/hive/hive-*"]
template "#{dir_hive[0]}/conf/hive-site.xml" do
source "devg_hive-site.xml.erb"
mode 0644
end
Es scheint, dass der Vorlagenname wird bei der Kompilierung ausgewertet zu werden, an welcher Stelle das Paket installieren ist nicht vollständig, so der Name /conf/hive-site.xml
ausgewertet wird immer statt /opt/mapr/hive/hive-1.2/conf/site.xml
. Wenn wir für all Pakete warten, um einen manuellen Lauf des folgenden Codes vollständig installiert und über einen separaten Aufruf zu werden oder zu tun:
dir_hive = Dir["/opt/mapr/hive/hive-*"]
template "#{dir_hive[0]}/conf/hive-site.xml" do
source "devg_hive-site.xml.erb"
mode 0644
end
Wir haben erfolgreiche Kopie der Konfigurationsdatei; Wenn es jedoch Teil des Prozesses ist, in dem Sie installieren und versuchen zu konfigurieren, funktioniert es nicht. Hier sind einige der anderen Dinge, die wir versucht:
- Versuchte die Config Kopie Teil des Codes in eine eigene Rezeptur zu bewegen und erstellt eine Laufliste und zu hoffen, dass, wenn die Reihenfolge der Ausführung beibehalten wird, sobald die Die Installation des Pakets ist abgeschlossen. Das Dateiverzeichnis wird verfügbar sein, damit wir den richtigen Dateipfad haben. Das hat nicht funktioniert.
- Setzen Sie den Konfigurationscode unter ruby_block, lazy evluator only_if (Überprüfung auf/opt/mpar/hive dir), etc. Kein Glück.
- Kopiert die Quell-XML-Datei zu einem/tmp/dir versuchte, einfach die Datei zu kopieren, wenn/opt/mapr/hive dir verfügbar ist, wieder mit dem faulen Evaluator, ruby_block usw. Scheitert immer noch.
- Versucht, eine Schleife in ruby_block durchlaufen zu versuchen,
if !Dir.glob('/opt/mapr/hive/hive-*/conf/hive-site.xml').empty?
zu überprüfen und für 5 Sekunden zu schlafen. Schlägt fehl.
Wenige andere Variationen zu den oben genannten waren auch nicht erfolgreich; In all diesen Fällen scheint es, dass die "#{dir_hive[0]}/conf/hive-site.xml"
zur Kompilierzeit ausgewertet wird und daher den falschen Dateipfad ergibt.
Was ist der beste Weg, um die installierte Dateipfad mit einem wildem Charakter zu erfassen und dann diesen Weg für einigen Betrieb verwenden (wie eine Konfigurationsdatei mit einem benutzerdefinierten ersetzen).
Alternativ können wir einen Ausdruck faul auswerten, um einen Variablennamen zu erhalten, nachdem eine Aktion ausgeführt wurde und der Name der verzögerten ausgewerteten Variablen von einem Dateinamen abhängt, der nach der Aktion entsteht?
Vielen Dank für Ihre Zeit und schätzen Sie alle Hinweise!
dies half , Danke! Ich stimme dem Paket-Versionierungsformat zu. Es ist für jedes der Pakete anders und wenn sie sich in Zukunft ändern, werden Skripts fehlschlagen. –