Wie man Dinge kocht, die es noch nicht gibt

9

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/somecommandexistiert 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?

Gaius
quelle
So etwas ist in CFEngine kein Problem
Gaius
1
Ohne Einblick in die Verwendung von myvargibt 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. Kurz ruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
gesagt
@ Tensibai node.run_statewar genau das, wonach ich gesucht habe - danke. Machen Sie das eine Antwort und ich werde es akzeptieren!
Gaius
Das muss bis morgen warten :) zu schwer, um eine richtige Antwort am Telefon zu schreiben
Tensibai

Antworten:

4

Ich würde mit gehen node.run_state, um eine transiente Variable in einem Lauf zu speichern und sie in einem zu definieren, ruby_blockso dass es zur Konvergenzzeit passiert, ungefähr so:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

Soweit ich weiß, ist das Erfordernis von 'mixlib / shellout' nicht erforderlich.

Tensibai
quelle
2

Die Einzelheiten hängen vom genauen Anwendungsfall ab. Wenn der Wert nur als Eigenschaft für eine andere Ressource verwendet wird, verwenden Sie die lazyHilfsmethode. Wenn Sie die Ausgabe nicht benötigen, würden Sie die executeRessource verwenden. In einigen komplexeren Fällen können Sie eine ruby_blockRessource verwenden oder Ihre eigene benutzerdefinierte Ressource schreiben.

Codierer
quelle