Допустим, у меня есть некоторый код Chef, например:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Где /bin/somecommand
еще не существует, потому что он установлен somepackage
. По этой причине это не удастся во время компиляции рецепта, но, очевидно, будет работать во время конвергенции, при условии, что пакет будет успешно установлен (и если этого не произойдет, то, очевидно, рецепт все равно будет неудачным). Это также дает сбой, если пакет установлен по предыдущему рецепту в списке выполнения, поскольку все они скомпилированы заранее. Как включить в рецепт шеф-повара вещи, которые этот рецепт или список запуска устанавливает самостоятельно?
myvar
реального ответа нет, обычно я избегаю использования оценки кода из внешних команд во время компиляции, если только в этом нет необходимости определять другие ресурсы.ruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
node.run_state
был именно тем, что я искал - спасибо. Сделай ответ, и я приму его!Ответы:
Я бы хотел
node.run_state
сохранить временную переменную в прогоне и определить ееruby_block
так, чтобы это происходило во время конвергенции, что-то вроде этого:Насколько я знаю, требовать 'mixlib / shellout' не обязательно.
источник
Особенности зависят от конкретного варианта использования. Если значение используется только как свойство другого ресурса, вы должны использовать
lazy
вспомогательный метод. Если вам не нужен вывод, вы бы использовалиexecute
ресурс. В некоторых более сложных случаях вы можете использоватьruby_block
ресурс или написать свой собственный ресурс.источник