Як шеф-кухаря речі, які ще не існують


9

Скажімо, у мене є такий код шеф-кухаря, як:

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

Де /bin/somecommandще не існує, оскільки його встановлено somepackage. З цієї причини це не вдасться під час компіляції рецептів, але, очевидно, буде працювати в час конвергенції, забезпечуючи успішне встановлення пакета (і якщо цього не відбувається, явно рецепт все одно не вдався). Це також не вдається, якщо встановлений пакет буде попереднім рецептом у списку запуску, оскільки всі вони складені разом наперед. Як я включаю речі в рецепт шеф-кухаря, який цей рецепт чи список списку встановлює сам?


Такі речі не є проблемою у CFEngine
Гай

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" не потрібно.


2

Специфіка залежить від конкретного випадку використання. Якщо значення використовується лише як властивість на іншому ресурсі, ви використовуєте lazyhelper метод. Якщо вам не потрібен вихід, ви використовуєте executeресурс. У деяких складніших випадках ви можете використовувати ruby_blockресурс або написати власний користувацький ресурс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.