2011-12-16 14 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 संसाधन का उपयोग स्रोत से निर्माण। मुझे पता है कि हमेशा उपलब्ध या संभव नहीं है, इसलिए ...

विधि है जो आप एक बनाने के "कॉन्फ़िगर & & बनाने & & बनाने स्थापित" शैली स्थापना स्क्रिप्ट idempotent सॉफ्टवेयर की तरह आप काम कर रहे हैं पर निर्भर करता है साथ में। अक्सर, लक्ष्य फ़ाइल के अस्तित्व की जांच करने के लिए पर्याप्त है। कभी-कभी, यह निर्धारित करने के लिए वांछनीय है कि कौन सा संस्करण आवश्यक है, और उचित कमांड लाइन विकल्प के साथ निष्पादित होने पर प्रोग्राम कौन सा संस्करण आउटपुट करेगा। मैं इन उदाहरणों के लिए एक प्रारंभिक बिंदु के रूप में उपरोक्त संसाधन का उपयोग करूंगा। ध्यान दें कि bashscript संसाधनों के लिए शॉर्टकट के रूप में bash का उपयोग कर सकते हैं जिनमें दुभाषिया bash है।

मानदंड: कार्यक्रम /usr/local/bin/program पर स्थापित किया गया है और संस्करण संख्या प्रदर्शित करने के लिए --version पर तर्क लेता है। मैंने && के साथ सीडी, कॉन्फ़िगर, और कमांड को एक साथ रखा क्योंकि संभवतः अगर कोई विफल रहता है तो हमें निष्पादन जारी रखने का प्रयास नहीं करना चाहिए।

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 संसाधन का उपयोग करने के रूप में इस अपने आप ही idempotent है थोड़ा बेहतर है। ध्यान दें कि checksum पैरामीटर एक विशेषता के रूप में मान के साथ जोड़ा गया है। यह पैरामीटर शेफ को दूरस्थ फ़ाइल डाउनलोड नहीं करने देता है यदि स्थानीय लक्ष्य फ़ाइल चेकसम से मेल खाती है। यह एक SHA256 चेकसम है। साथ ही, यह संसाधन स्क्रिप्ट को तत्काल चलाने के लिए सूचित करेगा, इसलिए इसे डाउनलोड करने के बाद। स्क्रिप्ट को :nothing एक्शन के साथ सेट किया गया है, इसलिए दूरस्थ_फाइल डाउनलोड होने पर ही इसे निष्पादित किया जाता है।

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] का मान है। उदाहरण के लिए: http://github.com/opscode/cookbooks:

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

और उदाहरण के लिए, आप कई cookbooks Opscode यहाँ द्वारा साझा में "स्रोत" व्यंजनों देख सकते हैं। php, python, gnu_parallel, और nagios कुकबुक में सभी "स्रोत" व्यंजन हैं।

+0

नोट: ''remote_file'' वाला बग कभी' '.gz'' एक्सटेंशन वाली फ़ाइल'' tar.gz'' 'के साथ एक फ़ाइल' ungzip'' कर सकता है। तो 'tar -zxf'' असफल हो जाएगा क्योंकि यह वास्तव में एक gzip नहीं है। – Evgeny

+1

मुझे यह जवाब पसंद है – Galen

+0

@jtimberman क्या आप कृपया अधिक बता सकते हैं, जहां 'प्रोग्राम' और' संस्करण' चर से –

संबंधित मुद्दे