Nehmen wir an, ich habe einen Chef-Code wie:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Wo /bin/somecommand
existiert noch nicht, weil es von installiert wird somepackage
. Dies schlägt aus diesem Grund zur Kompilierungszeit des Rezepts fehl, funktioniert jedoch offensichtlich zur Konvergenzzeit, sofern das Paket erfolgreich installiert wird (und wenn dies nicht der Fall ist, ist das Rezept offensichtlich trotzdem fehlgeschlagen). Dies schlägt auch fehl, wenn das Paket als vorheriges Rezept in der Runlist installiert wurde, da alle im Voraus zusammen kompiliert wurden. Wie füge ich Dinge in ein Chef-Rezept ein, die dieses Rezept oder diese Runlist selbst installiert?
myvar
gibt es keine wirkliche Antwort. Normalerweise vermeide ich die Verwendung der Code-Auswertung von externen Befehlen zur Kompilierungszeit, es sei denn, dies ist sehr notwendig, um andere Ressourcen zu definieren. Kurzruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
node.run_state
war genau das, wonach ich gesucht habe - danke. Machen Sie das eine Antwort und ich werde es akzeptieren!Antworten:
Ich würde mit gehen
node.run_state
, um eine transiente Variable in einem Lauf zu speichern und sie in einem zu definieren,ruby_block
so dass es zur Konvergenzzeit passiert, ungefähr so:Soweit ich weiß, ist das Erfordernis von 'mixlib / shellout' nicht erforderlich.
quelle
Die Einzelheiten hängen vom genauen Anwendungsfall ab. Wenn der Wert nur als Eigenschaft für eine andere Ressource verwendet wird, verwenden Sie die
lazy
Hilfsmethode. Wenn Sie die Ausgabe nicht benötigen, würden Sie dieexecute
Ressource verwenden. In einigen komplexeren Fällen können Sie eineruby_block
Ressource verwenden oder Ihre eigene benutzerdefinierte Ressource schreiben.quelle