Katakanlah saya punya beberapa kode Chef seperti:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Di mana /bin/somecommand
belum ada karena diinstal oleh somepackage
. Ini akan gagal pada waktu kompilasi resep karena alasan itu, tetapi jelas akan bekerja pada waktu konvergensi dengan menyediakan paket yang berhasil diinstal (dan jika tidak maka resep pasti gagal juga). Ini juga gagal jika paket diinstal menjadi resep sebelumnya di runlist karena mereka semua dikompilasi bersama dimuka. Bagaimana cara saya memasukkan hal-hal dalam resep Chef yang diinstal sendiri oleh resep atau daftar run itu?
myvar
tidak ada jawaban nyata, biasanya saya menghindari menggunakan evaluasi kode dari perintah eksternal pada waktu kompilasi kecuali sangat diperlukan untuk mendefinisikan sumber daya lainnya. Secara singkat, saya akan melakukanruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
node.run_state
persis seperti yang saya cari - terima kasih. Buat itu jawaban dan saya akan menerimanya!Jawaban:
Saya akan pergi dengan
node.run_state
menyimpan variabel sementara dalam menjalankan dan mendefinisikannya dalamruby_block
sehingga terjadi pada waktu yang bersamaan, sesuatu seperti ini:Sejauh yang saya tahu membutuhkan 'mixlib / shellout' tidak perlu.
sumber
Spesifikasinya tergantung pada kasus penggunaan yang tepat. Jika nilai hanya digunakan sebagai properti di sumber daya lain, Anda akan menggunakan
lazy
metode helper. Jika Anda tidak membutuhkan output, Anda akan menggunakanexecute
sumber daya. Dalam beberapa kasus yang lebih kompleks, Anda mungkin menggunakanruby_block
sumber daya atau menulis sumber daya kustom Anda sendiri.sumber