सबसे पहले, यदि आप एक आंतरिक पैकेज भंडार की मेजबानी के लिए साधन नहीं है, मैं आम तौर पर अनुशंसा करते हैं कि आप अपने लक्ष्य मंच (रों) के लिए देशी संकुल का निर्माण, और उन्हें प्रबंधित करने के बजाय package
संसाधन का उपयोग स्रोत से निर्माण। मुझे पता है कि हमेशा उपलब्ध या संभव नहीं है, इसलिए ...
विधि है जो आप एक बनाने के "कॉन्फ़िगर & & बनाने & & बनाने स्थापित" शैली स्थापना स्क्रिप्ट idempotent सॉफ्टवेयर की तरह आप काम कर रहे हैं पर निर्भर करता है साथ में। अक्सर, लक्ष्य फ़ाइल के अस्तित्व की जांच करने के लिए पर्याप्त है। कभी-कभी, यह निर्धारित करने के लिए वांछनीय है कि कौन सा संस्करण आवश्यक है, और उचित कमांड लाइन विकल्प के साथ निष्पादित होने पर प्रोग्राम कौन सा संस्करण आउटपुट करेगा। मैं इन उदाहरणों के लिए एक प्रारंभिक बिंदु के रूप में उपरोक्त संसाधन का उपयोग करूंगा। ध्यान दें कि bash
script
संसाधनों के लिए शॉर्टकट के रूप में 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
कुकबुक में सभी "स्रोत" व्यंजन हैं।
नोट: ''remote_file'' वाला बग कभी' '.gz'' एक्सटेंशन वाली फ़ाइल'' tar.gz'' 'के साथ एक फ़ाइल' ungzip'' कर सकता है। तो 'tar -zxf'' असफल हो जाएगा क्योंकि यह वास्तव में एक gzip नहीं है। – Evgeny
मुझे यह जवाब पसंद है – Galen
@jtimberman क्या आप कृपया अधिक बता सकते हैं, जहां 'प्रोग्राम' और' संस्करण' चर से –