私の使用例を示してから、考えられる解決策について説明したいと思います。
問題 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 を解決するにはどうすればよいですか?