2013-02-26 145 views
1

所以我使用下面的方法:製作廚師的菜譜食譜只運行一次

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 

它成功地安裝上的NodeJS我的流浪VM但重啓它變得再次執行。我如何防止這種情況?閱讀紅寶石代碼我不太好。

回答

6

要使remote_file資源具有冪等性(即不下載已經存在的文件),必須正確指定文件的校驗和。您可以使用node["nodejs"]["checksum"]屬性在代碼中執行此操作。但是,這隻適用於,如果校驗和被正確指定爲下載文件的SHA256散列,則不支持其他算法(特別是不支持MD5)。

如果校驗和不正確,您的配方仍然可以使用。但是,下次運行時,Chef會注意到現有文件的校驗和與您指定的不同,並且會再次下載該文件,從而通知install node資源並完成整個編譯工作。

+0

謝謝,校驗和確實是MD5,當我使用SHA256時,它不再受到干擾。 – Michelle 2013-02-27 21:15:08

2

與廚師,重要的是食譜是冪等的。這意味着他們應該能夠一遍又一遍地運行而不改變結果。廚師希望能夠定期在節點上運行所有配方,這應該沒問題。

您是否知道該配方中哪些資源導致您的問題? remote_file是唯一一個我懷疑是非冪等的人,但我不確定。

望着廚師的wiki,我發現這一點:

推薦行爲在廚師0.8.4及更早版本,遠程文件也被用在了一本食譜來從文件/目錄下的文件 。此 行爲現在由#Cookbook文件提供,並且使用遠程文件 此目的在以後的廚師0.9.0和 中被棄用(儘管仍然有效)。

無論如何,廚師的方式往往工作,它會查看是否任何"#{Chef::Config[:file_cache_path]}/node-v#{node["nodejs"]["version"]}.tar.gz"解析爲存在,如果這樣做,應跳過資源。 install-node安裝完成後是否可能刪除該文件?如果是這樣,廚師每次都會重新取回。

+0

替換當前的運行列表中的[日誌](https://開頭gist.github.com/anonymous/5035245)它看起來像是重新運行'remote_file'部分。 – Michelle 2013-02-26 02:17:15

1

根據我的經驗,remote_file在執行chef-client時始終運行,即使目標文件已經存在。不過,我不確定爲什麼(還沒有挖掘到Chef代碼來找到錯誤的確切原因)。

您總是可以編寫一個not_ifonly_if來控制remote_file資源的執行,但通常每次只讓它運行是無害的。

其餘的代碼看起來已經是冪等的,所以重複運行客戶端沒有任何壞處。

有你可以指定remote_file的行動,這將使它有條件地運行:

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

the docs

+2

每次下載文件都不是缺陷,除非有明確的條件阻止匹配。它將確保文件始終是正確的,即使遠程文件在相同的URL上發生變化。 – 2013-02-27 21:19:49

0

如果你想測試你的食譜是否是冪等的,你可能會對Toaster感興趣,這是一個系統測試Chef腳本的框架。

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

廚師食譜與在分離的容器的環境(泊塢VM)的不同的配置中執行,和烤麪包機報告各種度量如系統狀態的變化,收斂特性,和冪等的問題。

1

只能用-o修飾符覆蓋運行列表,才能運行配方。

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

-o RunlistItem,RunlistItem ...,基於指定的項目

--override-運行列表