まだ存在しないものをシェフする方法


9

次のようなChefコードがあるとします。

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

どこに/bin/somecommandそれがでインストールされているため、まだ存在していませんsomepackage。これはその理由でレシピのコンパイル時に失敗しますが、パッケージが正常にインストールされれば、収束時に明らかに機能します(それでも失敗しない場合は、レシピが失敗したことは明らかです)。パッケージがインストールされている場合、これらはすべて事前にコンパイルされるため、ランリストの前のレシピとしても失敗します。Chefレシピに、そのレシピまたはランリストがインストールするものを含めるにはどうすればよいですか?


この種のことはCFEngineでは問題ではありません
Gaius

1
myvar実際の答えはありません。使用に関する洞察がなければ、他のリソースを定義する必要がない限り、通常はコンパイル時に外部コマンドからのコード評価を使用しません。手短に言えば、私は次のことをしますruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai

@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

詳細はユースケースによって異なります。値が別のリソースのプロパティとしてのみ使用される場合は、lazyヘルパーメソッドを使用します。出力が必要ない場合は、executeリソースを使用します。さらに複雑なケースでは、ruby_blockリソースを使用したり、独自のカスタムリソースを作成したりできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.