4

だから私は次のレシピを使用します:

include_recipe "build-essential"

node_packages = value_for_platform(
  [ "debian", "ubuntu" ]                      => { "default" => [ "libssl-dev" ] },
  [ "amazon", "centos", "fedora", "centos" ]  => { "default" => [ "openssl-devel" ] },
  "default"   => [ "libssl-dev" ]
)

node_packages.each do |node_package|
  package node_package do
    action :install
  end
end

bash "install-node" do
  cwd Chef::Config[:file_cache_path]
  code <<-EOH
    tar -xzf node-v#{node["nodejs"]["version"]}.tar.gz
    (cd node-v#{node["nodejs"]["version"]} && ./configure --prefix=#{node["nodejs"]["dir"]} && make && make install)
  EOH
  action :nothing
  not_if "#{node["nodejs"]["dir"]}/bin/node --version 2>&1 | grep #{node["nodejs"]["version"]}"
end

remote_file "#{Chef::Config[:file_cache_path]}/node-v#{node["nodejs"]["version"]}.tar.gz" do
  source node["nodejs"]["url"]
  checksum node["nodejs"]["checksum"]
  notifies :run, resources(:bash => "install-node"), :immediately
end

Vagrant VMにnodejsが正常にインストールされましたが、再起動すると再び実行されます。これを防ぐにはどうすればよいですか?私はルビーのコードを読むのが苦手です。

4

5 に答える 5

8

remote_fileリソースをべき等にする(つまり、すでに存在するファイルを再度ダウンロードしない)には、ファイルのチェックサムを正しく指定する必要があります。これは、属性を使用してコードで行いnode["nodejs"]["checksum"]ます。ただし、これは、チェックサムがダウンロードされたファイルのSHA256ハッシュとして正しく指定されている場合にのみ機能し、他のアルゴリズム(特に、MD5ではない)はサポートされません。

チェックサムが正しくない場合でも、レシピは機能します。ただし、次回の実行時に、Chefは既存のファイルのチェックサムが指定したものと異なることに気付き、ファイルを再度ダウンロードするため、リソースに通知してinstall nodeコンパイル全体を実行します。

于 2013-02-27T19:54:47.413 に答える
2

シェフの場合、レシピがべき等であることが重要です。つまり、結果を変えることなく、何度も何度も実行できるはずです。Chefは、ノード上ですべてのレシピを定期的に実行できることを期待しており、それで問題ないはずです。

そのレシピ内のどのリソースが問題を引き起こしているのかを知る方法はありますか?remote_fileは、べき等ではないと疑っている唯一のファイルですが、手に負えないかどうかはわかりません。

Chef wikiを見ると、次のことがわかります。

非推奨の動作Chef0.8.x以前では、リモートファイルはクックブックのfiles/ディレクトリからファイルをフェッチするためにも使用されます。この動作は現在#CookbookFileによって提供されており、この目的でのRemoteFileの使用はChef0.9.0以降では非推奨になっています(ただし、まだ有効です)。

とにかく、chefが機能する傾向があるので、"#{Chef::Config[:file_cache_path]}/node-v#{node["nodejs"]["version"]}.tar.gz"解決するものが存在するかどうかを確認し、存在する場合は、そのリソースをスキップする必要があります。install-nodeインストールが完了したときにそのファイルを削除することは可能ですか?その場合、シェフは毎回それを再フェッチします。

于 2013-02-26T02:11:00.170 に答える
1

私の経験では、ターゲットファイルがすでに存在している場合でも、remote_file実行時に常に実行されます。chef-clientただし、理由はわかりません(バグの正確な原因を見つけるためにChefコードを掘り下げていません)。

いつでもnot_ifまたはonly_ifを記述してリソースの実行を制御できますremote_fileが、通常は毎回実行させるだけでも無害です。

コードの残りの部分はすでにべき等であるように見えるので、クライアントを繰り返し実行しても害はありません。

remote_file条件付きで実行するように指定できるアクションがあります。

remote_file 'target' do
  source 'wherever'
  action :create_if_missing
end

ドキュメントを参照してください。

于 2013-02-26T02:33:22.563 に答える
1

レシピを実行できるのは、 -o修飾子を使用して実行リストをオーバーライドした場合のみです。

sudo chef-client -o "recipe[cookbook::recipe]"

-o RunlistItem、RunlistItem ...、現在の実行リストを指定されたアイテムに置き換えます

--override-runlist

于 2015-08-27T14:01:08.157 に答える
0

レシピがべき等であるかどうかをテストしたい場合は、Chefスクリプトの体系的なテストのためのフレームワークであるToASTERに興味があるかもしれません。

http://cloud-toaster.github.io/

Chefレシピは、分離されたコンテナー環境(Docker VM)でさまざまな構成で実行され、ToASTERは、システム状態の変化、収束プロパティ、べき等の問題などのさまざまなメトリックを報告します。

于 2014-06-19T11:40:41.000 に答える