Bagaimana cara Chef hal-hal yang belum ada

9

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/somecommandbelum 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?

Gayus
sumber
Hal semacam ini bukan masalah di CFEngine
Gayus
1
Tanpa wawasan tentang penggunaan myvartidak 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.[...] }
Tensibai
@Tensibai node.run_statepersis seperti yang saya cari - terima kasih. Buat itu jawaban dan saya akan menerimanya!
Gayus
Itu harus menunggu sampai besok :) terlalu sulit untuk menulis jawaban yang benar di telepon
Tensibai

Jawaban:

4

Saya akan pergi dengan node.run_statemenyimpan variabel sementara dalam menjalankan dan mendefinisikannya dalam ruby_blocksehingga terjadi pada waktu yang bersamaan, sesuatu seperti ini:

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

Sejauh yang saya tahu membutuhkan 'mixlib / shellout' tidak perlu.

Tensibai
sumber
2

Spesifikasinya tergantung pada kasus penggunaan yang tepat. Jika nilai hanya digunakan sebagai properti di sumber daya lain, Anda akan menggunakan lazymetode helper. Jika Anda tidak membutuhkan output, Anda akan menggunakan executesumber daya. Dalam beberapa kasus yang lebih kompleks, Anda mungkin menggunakan ruby_blocksumber daya atau menulis sumber daya kustom Anda sendiri.

pembuat kode
sumber