2013-07-17 9 views
5

Ich mag würde Ihnen Fall meiner Verwendung zeigen und dann mögliche Lösungen diskutieren:Variablen zwischen Koch Ressourcen Passing

Problem A: ich habe 2 Rezepte, „a“ und „b“ .. „a“ installiert einig Programm auf meinem Dateisystem (sagen wir bei "/usr/local/bin/stuff.sh" und Rezept "b" muss dies ausführen und etwas mit der Ausgabe.

so Rezept "a" sieht etwa so aus:

(das Skript nur echo (es) "Zeug" zu stdout)

und Rezept „b“ sieht etwa so aus:

include_recipe "a" 
var=`/usr/local/bin/stuff.sh` 

und jetzt mit ihm etwas muss ich tun, zum Beispiel erstellen Sie einen Benutzer mit diesem (die einfachen Anführungszeichen beachten, varstuff enthalten sollte) Nutzername. so im Skript „b“ i

user "#{node[:var]}" 

hinzufügen Wie es passiert, das nicht funktioniert .. anscheinend Koch alles läuft, die nicht eine Ressource ist und läuft nur dann die Ressourcen so, sobald ich das Skript Koch laufen beschwert sich, dass es nicht kompilieren kann, weil es zuerst versucht, die "var = ..." Zeile bei Rezept "b" auszuführen und fehlschlägt, weil das "execute ..." bei Rezept a noch nicht ausgeführt wurde und so das "stuff.sh" Skript existiert noch nicht. Unnötig zu sagen, das ist extrem ärgerlich, da es den "Chef rennt alles in der Reihenfolge von oben nach unten" bricht, dass ich versprochen wurde, als ich anfing es zu benutzen. Allerdings bin ich nicht sehr wählerisch, also fing ich an, nach alternativen Lösungen für dieses Problem zu suchen, also:

Problem B: Ich bin über die Idee von "ruby_block" gelaufen. anscheinend ist dies eine Ressource, also wird es zusammen mit den anderen Ressourcen ausgewertet. Ich sagte ok, dann würde ich gerne das Skript erstellen, die Ausgabe in einem "ruby_block" erhalten und dann an "user" übergeben. so Rezept „b“ sieht nun so etwas wie:

include_recipe "a" 

ruby_block "a_block" do 
    block do 
    node.default[:var] = `/usr/local/bin/stuff.sh` 
    end 
end 

user "#{node[:var]}" 

Da es jedoch die Variable stellt sich heraus (var) nicht von „ruby_block“ bestanden „user“ und es bleibt leer. Egal was Jonglieren ich damit versucht habe, ich scheiterte (oder vielleicht fand ich einfach nicht die richtige Jongliermethode)

Um den Koch/Ruby Meister rund: Wie löse ich Problem A? Wie löse ich Problem B?

Antwort

6

Sie haben das Problem A bereits mit dem Ruby-Block gelöst.

Jetzt müssen Sie Problem B mit einem ähnlichen Ansatz lösen:

ruby_block "create user" do 
    block do 
    user = Chef::Resource::User.new(node[:var], run_context) 
    user.shell '/bin/bash' # Set parameters using this syntax 
    user.run_action :create 
    user.run_action :manage # Run multiple actions (if needed) by declaring them sequentially 
    end 
end 

Sie auch Problem A während der Kompilierung-Phase, indem Sie die Datei lösen könnte:

execute "echo 'echo stuff' > /usr/local/bin/stuff.sh" do 
    action :nothing 
end.run_action(:run) 

Wenn nach Diese Vorgehensweise, stellen Sie sicher, dass:

  • /usr/local/bin existieren während der Kompilierungsphase des Chefs;
  • Entweder:
    • stuff.sh ist ausführbar; OR
    • Execute es durch eine Schale (z.B .: var=`sh /usr/local/bin/stuff.sh`