2011-12-16 130 views
35

我有一個從源代碼構建的程序。爲此,我使用script資源。什麼是實施安裝和更新邏輯的好方法?現在我只需要使用內置的not_if條件進行安裝。廚師安裝和更新源程序

script "install_program" do 
    not_if {File.exists?('/program')} 
    interpreter "bash" 
    user "root" 
    cwd "/tmp" 
    code <<-EOH 
    wget http://www.example.com/program.tar.gz 
    tar -zxf program.tar.gz 
    cd tarball 
    ./configure 
    make 
    make install 
    EOH 
end 

回答

67

首先,如果你要舉辦一個內部包庫的方式,我通常建議你建立你的目標平臺(一個或多個)本地程序包,並使用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/cookbooksphppythongnu_parallelnagios烹飪書都有「源」食譜。

+0

注意:''remote_file''的錯誤有時候可以''ungzip''擴展名爲''.gz'的文件,比如''tar.gz''。所以'tar -zxf''會失敗,因爲它不是一個真正的gzip。 – Evgeny

+1

我喜歡這個答案 – Galen

+0

@jtimberman能否請你解釋一下,從'program'和'version'變量設置的位置 –