Jak gotować rzeczy, które jeszcze nie istnieją

9

Powiedzmy, że mam kod szefa kuchni, taki jak:

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

Gdzie /bin/somecommandjeszcze nie istnieje, ponieważ jest zainstalowany przez somepackage. Z tego powodu to się nie powiedzie w czasie kompilacji receptury, ale oczywiście zadziała w czasie konwergencji, pod warunkiem, że pakiet zostanie zainstalowany pomyślnie (a jeśli nie, to oczywiście i tak się nie powiedzie). Nie powiedzie się to również, jeśli pakiet zostanie zainstalowany jako poprzedni przepis na liście run, ponieważ wszystkie są kompilowane razem z góry. Jak zawrzeć w przepisie szefa kuchni rzeczy, które ten przepis lub lista startowa instaluje się sam?

Gajusz
źródło
Tego rodzaju sprawa nie stanowi problemu w CFEngine
Gaius
1
Bez wglądu w użycie myvarnie ma prawdziwej odpowiedzi, zwykle unikam używania oceny kodu z zewnętrznych poleceń w czasie kompilacji, chyba że jest to bardzo konieczne do zdefiniowania innych zasobów. W skrócie, zrobiłbymruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai
@Tensibai node.run_statebyło dokładnie tym, czego szukałem - dzięki. Uczyń to odpowiedź, a ja ją zaakceptuję!
Gajusz
To będzie musiało poczekać do jutra :) zbyt trudno napisać poprawną odpowiedź na telefon
Tensibai

Odpowiedzi:

4

Chciałbym node.run_statezapisać zmienną przejściową w przebiegu i zdefiniować ją w taki ruby_blocksposób, aby zdarzyło się to w czasie zbieżności, mniej więcej tak:

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

O ile wiem wymaganie 'mixlib / shellout' nie jest konieczne.

Tensibai
źródło
2

Szczegóły zależą od dokładnego przypadku użycia. Jeśli wartość jest używana tylko jako właściwość w innym zasobie, należy użyć lazymetody pomocniczej. Jeśli nie potrzebujesz danych wyjściowych, skorzystasz z executezasobu. W niektórych bardziej skomplikowanych przypadkach możesz użyć ruby_blockzasobu lub napisać własny zasób niestandardowy.

koderanger
źródło