7

私の使用例を示してから、考えられる解決策について説明したいと思います。

問題 A: 「a」と「b」の 2 つのレシピがあります。「a」は、ファイル システムにプログラムをインストールします (たとえば、「/usr/local/bin/stuff.sh」でレシピ「b」を実行する必要があります)。これと出力で何かをします。

レシピ「a」は次のようになります。

execute "echo 'echo stuff' > /usr/local/bin/stuff.sh" 

(スクリプトは「もの」を標準出力にエコーするだけです)

レシピ「b」は次のようになります。

include_recipe "a"
var=`/usr/local/bin/stuff.sh` 

(逆引用符に注意してください。var含む必要がありますstuff)

そして今、私はそれで何かをする必要があります.たとえば、このユーザー名でユーザーを作成します. だからスクリプト「b」で私は追加します

user "#{node[:var]}"

たまたま、これは機能しません..どうやらシェフはリソースではないすべてのものを実行し、次にリソースを実行するようです。そのため、スクリプトを実行するとすぐに、シェフは最初に「var = ...」行が失敗し、レシピ a の「execute ...」がまだ実行されておらず、「stuff.sh」スクリプトがまだ存在しないため失敗します。言うまでもなく、これは私が使い始めたときに約束された「Chef はすべてを上から下に順番に実行する」を破るため、非常に迷惑です。ただし、私はあまりうるさいわけではないので、この問題の代替ソリューションを探し始めました。

問題 B: 「ruby_block」のアイデアに出くわしました。明らかに、これはリソースであるため、他のリソースと一緒に評価されます。OKと言ったので、スクリプトを作成し、「ruby_block」で出力を取得してから「user」に渡します。レシピ「b」は次のようになります。

include_recipe "a"

ruby_block "a_block" do
  block do
    node.default[:var] = `/usr/local/bin/stuff.sh`
  end
end

user "#{node[:var]}"

しかし、変数 ( var) が "ruby_block" から "user" に渡されておらず、空のままになっています。どんなジャグリングを試みても失敗しました(または、正しいジャグリング方法が見つからなかっただけかもしれません)

周りのシェフ/ルビーマスターへ: どうすれば問題Aを解決できますか? 問題 B を解決するにはどうすればよいですか?

4

3 に答える 3

0

あなたが抱えている問題を解決するには、実際にはいくつかの方法があります。

最初の方法は、渡されたブロックで発生しているスコープの問題を回避し、そのようなことを行うことです。

include_recipe "a"
this = self

ruby_block "a_block" do
  block do
    this.user `/usr/local/bin/stuff.sh`
  end
end

これを一度だけ使用する予定であると仮定すると、それはうまくいくでしょう. しかし、他の用途のためにノードに変数を格納することが合法的に必要な場合は、問題を回避するために ruby​​ 内の遅延呼び出しに頼ることができます。

include_recipe "a"

ruby_block "a_block" do
  block do
    node.default[:var] = `/usr/local/bin/stuff.sh`.strip
  end
end

user do
    username lazy { "#{node[:var]}" }
 end

Chef を使用すると、このような場合のすべてのデフォルトの仮定をオーバーライドできることにすぐに気付くでしょう。

于 2020-03-27T22:33:12.860 に答える