Как готовить вещи, которые еще не существуют

9

Допустим, у меня есть некоторый код Chef, например:

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

Где /bin/somecommandеще не существует, потому что он установлен somepackage. По этой причине это не удастся во время компиляции рецепта, но, очевидно, будет работать во время конвергенции, при условии, что пакет будет успешно установлен (и если этого не произойдет, то, очевидно, рецепт все равно будет неудачным). Это также дает сбой, если пакет установлен по предыдущему рецепту в списке выполнения, поскольку все они скомпилированы заранее. Как включить в рецепт шеф-повара вещи, которые этот рецепт или список запуска устанавливает самостоятельно?

Gaius
источник
Такого рода вещи не проблема в CFEngine
Gaius
1
Без понимания использования myvarреального ответа нет, обычно я избегаю использования оценки кода из внешних команд во время компиляции, если только в этом нет необходимости определять другие ресурсы. ruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Короче
@Tensibai node.run_stateбыл именно тем, что я искал - спасибо. Сделай ответ, и я приму его!
Гай
Это придется подождать до завтра :) Слишком сложно написать правильный ответ по телефону
Tensibai

Ответы:

4

Я бы хотел node.run_stateсохранить временную переменную в прогоне и определить ее ruby_blockтак, чтобы это происходило во время конвергенции, что-то вроде этого:

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

Насколько я знаю, требовать 'mixlib / shellout' не обязательно.

Tensibai
источник
2

Особенности зависят от конкретного варианта использования. Если значение используется только как свойство другого ресурса, вы должны использовать lazyвспомогательный метод. Если вам не нужен вывод, вы бы использовали executeресурс. В некоторых более сложных случаях вы можете использовать ruby_blockресурс или написать свой собственный ресурс.

coderanger
источник