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/somecommand
jeszcze 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?
myvar
nie 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.[...] }
node.run_state
było dokładnie tym, czego szukałem - dzięki. Uczyń to odpowiedź, a ja ją zaakceptuję!Odpowiedzi:
Chciałbym
node.run_state
zapisać zmienną przejściową w przebiegu i zdefiniować ją w takiruby_block
sposób, aby zdarzyło się to w czasie zbieżności, mniej więcej tak:O ile wiem wymaganie 'mixlib / shellout' nie jest konieczne.
źródło
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ć
lazy
metody pomocniczej. Jeśli nie potrzebujesz danych wyjściowych, skorzystasz zexecute
zasobu. W niektórych bardziej skomplikowanych przypadkach możesz użyćruby_block
zasobu lub napisać własny zasób niestandardowy.źródło