2011-12-16 15 views
35

Kaynak yapıyorum bir program var. Bunun için script kaynağını kullanıyorum. Yükleme ve güncelleme için mantığı uygulamak için iyi bir yol nedir? Şu anda sadece yerleşik not_if koşullu yüklemeyi uygulamam var. Dahili bir paket deposu barındırmak için gerekli araçlara sahip olmadığınıchef Kaynaklar programdan yükleyin ve güncelleyin

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 

cevap

67

Her şeyden önce, ben genelde hedef platformu (ler) için doğal paketleri oluşturmak önerilir ve onları yönetmek yerine etmek package kaynağı kullanmak kaynaktan yapı. Ben stil yükleme komut İdempotent çalıştığınız yazılımın türüne bağlıdır "& & & & make install ./configure"

bir hale yöntemi ... o zaman kullanılabilir veya uygulanabilir olmadığını biliyoruz, bu yüzden ile. Çoğu zaman, hedef dosyanın varlığını kontrol etmek yeterlidir. Bazen, hangi sürümün gerekli olduğunu ve uygun komut satırı seçeneği ile çalıştırıldığında programın hangi sürümünün çıkacağını belirlemek istenebilir. Bu örnekler için yukarıdaki kaynağınızı bir başlangıç ​​noktası olarak kullanacağım. bash, bash yorumlayıcısına sahip script kaynakları için bir kısayol olarak kullanabileceğinizi unutmayın.

Varsayımlar: Program /usr/local/bin/program'a yüklenir ve sürüm numarasını görüntülemek için muhtemelen bir --version argümanını alır. Ben cd koymak, yapılandırmak ve komutları && ile birlikte yapmak, çünkü muhtemelen başarısız olursa, yürütmeye devam etmemeliyiz. Yerine wget kullanmanın

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 

kendi başına İdempotent olduğu gibi remote_file kaynağı kullanmak için biraz daha iyidir. checksum parametresinin, bir özellik olarak değeriyle eklendiğini unutmayın. Bu parametre, yerel hedef dosyasının sağlama toplamıyla eşleşmesi durumunda, şefe uzak dosyayı indirmemesini söyler. Bu bir SHA256 sağlama toplamıdır. Ayrıca, bu kaynak, komut dosyasını hemen indirilmeye, böylece indirildikten sonra bildirir. Komut dosyası eylem :nothing ile ayarlanır, böylece yalnızca remote_file indirilirse çalıştırılır. Ayrıca

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 başlatmanın ardından sisteminizde silinebilir. Chef::Config[:file_cache_path]'un değeri olan Chef'in dosya önbellek konumu gibi silinmeyen başka bir konuma indirmeniz önerilir. Örneğin: http://github.com/opscode/cookbooks: Daha fazla örnek için

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do 
    ... 
end 

, buradan Opscode tarafından paylaşılan çeşitli yemek kitaplarında "kaynak" tarifleri görebilirsiniz. php, python, gnu_parallel ve nagios yemek kitaplarının hepsinin "kaynak" tarifleri vardır.

+0

NOT: '' remote_file'' ile ilgili bir hata '' z.gz'' gibi '' .gz'' uzantılı bir dosyaya '' zıplama '' verebilir. Yani 'tar -zxf'' başarısız olacaktır çünkü gerçekten bir gzip değildir. – Evgeny

+1

Bu cevabı beğendim – Galen

+0

Daha fazla açıklayabiliyor musunuz? Jtimberman, programın ve sürümün –