首先,如果你要舉辦一個內部包庫的方式,我通常建議你建立你的目標平臺(一個或多個)本地程序包,並使用package
資源對它們進行管理,而不是從源頭上建設。我知道這並不總是可用的或可行的,所以......
你做的方法「的./configure & &使& &使安裝」式安裝腳本冪取決於你正在使用的那種軟件用。通常,檢查目標文件的存在就足夠了。有時,需要確定需要哪個版本,以及使用適當的命令行選項執行時,程序將輸出哪個版本。我將使用上面的資源作爲這些示例的起點。請注意,您可以使用bash
作爲script
資源的快捷方式,該資源具有口譯員bash
。
假設:該程序安裝到/usr/local/bin/program
並且可能需要參數--version
來顯示版本號。我把CD,配置和命令一起&&
,因爲大概如果一個失敗,我們不應該試圖繼續執行。
bash "install_program" do
not_if "/usr/local/bin/program --version | grep -q '#{node[:program][:version]}'"
user "root"
cwd "/tmp"
code <<-EOH
wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz
tar -zxf program-#{node[:program][:version]}.tar.gz
(cd program-#{node[:program][:version]}/ && ./configure && make && make install)
EOH
end
而不是使用wget
的實在是有點最好使用remote_file
資源,因爲這是對自己冪等。請注意,將添加checksum
參數,並將該值作爲屬性。如果本地目標文件與校驗和匹配,此參數告訴Chef不要下載遠程文件。這是一個SHA256校驗和。此外,此資源將通知腳本立即運行,因此在下載後。該腳本設置爲動作:nothing
,因此只有在下載remote_file時纔會執行該腳本。
remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do
source "http://www.example.com/program-#{node[:program][:version]}.tar.gz"
checksum node[:program][:checksum]
notifies :run, "bash[install_program]", :immediately
end
bash "install_program" do
user "root"
cwd "/tmp"
code <<-EOH
tar -zxf program-#{node[:program][:version]}.tar.gz
(cd program-#{node[:program][:version]}/ && ./configure && make && make install)
EOH
action :nothing
end
此外,/tmp
可能會在系統重新啓動後被刪除。建議您下載到另一個未刪除的位置,例如廚師的文件緩存位置,該值爲Chef::Config[:file_cache_path]
。例如:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
對於進一步的例子,你可以看到由Opscode公司這裏分享一些食譜「源」食譜:http://github.com/opscode/cookbooks。 php
,python
,gnu_parallel
和nagios
烹飪書都有「源」食譜。
注意:''remote_file''的錯誤有時候可以''ungzip''擴展名爲''.gz'的文件,比如''tar.gz''。所以'tar -zxf''會失敗,因爲它不是一個真正的gzip。 – Evgeny
我喜歡這個答案 – Galen
@jtimberman能否請你解釋一下,從'program'和'version'變量設置的位置 –