2017-01-20 4 views
0

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!

Antwort

1

Es ist extrem "stinkend" und es wird dich wahrscheinlich auf Upgrades beißen. Weil neuere Version höhere Nummer haben wird. So können Sie versuchen, last anstelle von first zu verwenden.

template "hive-site.xml" do 
    path lazy { "#{Dir['/opt/mapr/hive/hive-*'].last}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

Ich bin nicht sicher, wie häufig diese in Ihrem Code ist, aber Sie können über die Ressourcen/code denken, den Pfad aus dem Paket extrahiert (Metadaten oder Listendateien).

BEARBEITEN. Ich habe andere Gedanken. Paket kann in node["packages"] mit Version aufgenommen werden, die auf Ihrem Weg zugeordnet werden können, können Sie es verwenden und fallen Dir (Sie müssen noch faul Block), müssen Sie möglicherweise ohai Plugin laufen node["packages"] nach Paketinstallation aktualisieren (ich glaube, Sie kann Benachrichtigungen dafür verwenden).

Es kann so aussehen:

ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-client" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 

template "hive-site.xml" do 
    path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-client"]["version"]}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

Leider wahrscheinlich Version nicht auf Verzeichnisstruktur abbildet. Dieses Paket ist nur schlecht ;-)

+0

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. –

0
ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-hive" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 

template "hive-site.xml" do 
    path lazy { "/opr/mapr/hive/hive-#{node["packages"]["mapr-hive"]["version"]}/conf/hive-site.xml" } 
    source "devg_hive-site.xml.erb" 
end 

Aber Version 1.2.201611292220-1 schenkt, aber wir benötigen 1.2 nur

und was genau unter Code tut

ohai "reload packages" do 
    plugin "packages" 
    action :nothing 
end 

package "mapr-hive" do 
    notifies :reload, "ohai[reload packages]", :immediately 
end 
+0

Sie können leicht Version extrahieren - '" 1.2.201611292220-1 "[/ \ A (\ d + \. \ D +) /, 1]'. Wie für ohai neu laden, aktualisiert es Knotenattribute (https://docs.chef.io/resource_ohai.html), aber nur für [Pakete] (https://github.com/chef/ohai/blob/master/ lib/ohai/plugins/packages.rb) Plugin. Das Update wird nur ausgeführt, wenn die Paketressource geändert wird (ohai reload resource wird benachrichtigt). In Ihrem Fall wird es also bei der Paketinstallation nicht bei jeder Ausführung des Chef-Clients ausgeführt. –