/ / शेफ अपवादों को कैसे पकड़ना है - रूबी, शेफ, शेफ-रेसिपी

शेफ अपवादों को कैसे पकड़ें - रूबी, शेफ, शेफ-रेसिपी

मैं अभी एक बावर्ची नुस्खा पर काम कर रहा हूँ और मुझे एक कोड के परिणाम के आधार पर कुछ जानकारी के साथ एक डेटा बैग को अपडेट करने की आवश्यकता है। मूल रूप से मुझे सफल या असफल के साथ डेटा बैग को अपडेट करने की आवश्यकता है।

कोड इस तरह दिखता है:

begin
node[:fileDeploy].each do |f|
if f[:deploy]
cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do
owner users["tomcatUser"]
group users["tomcatGroup"]
mode "0755"
cookbook node[:cookbookName]
source "#{f[:sourceFilename]}"
end
end
end
# Update data bag: succeeded
rescue Chef::Exceptions::FileNotFound => e
# Update data bag: failed
end

समस्या यह है कि भले ही एगुम फाइल, बचाव खंड का निरीक्षण नहीं किया गया है और डेटा बैग को अपडेट नहीं किया गया है। इसलिए, जब मैं सर्वर पर कमांड sudo शेफ-क्लाइंट चलाता हूं, तो यह अपवाद के साथ समाप्त होता है Chef::Exceptions::FileNotFound लेकिन इसे संभाला नहीं जा रहा है rescue खंड मैथा। क्या इस का कोई मतलब निकलता है? कोई मदद?

उत्तर:

उत्तर № 1 के लिए 4

आपके बचाव खंड में अपवाद नहीं है क्योंकि अपवाद को उठाने वाला कोड अपवाद हैंडलर के दायरे में निष्पादित नहीं होता है।

अपने कोड में, आप एक की घोषणा करते हैं cookbook_file संसाधन।घोषणा ठीक हो जाती है और अभिसरण चरण के दौरान निष्पादन के लिए संसाधन निर्धारित किया जाता है। आपका बचाव ब्लॉक एक अपवाद को पकड़ सकता है जो संसाधन की घोषणा के दौरान होता है, न कि जब इसे वास्तव में निष्पादित किया जाता है।

कृपया देखें शेफ-क्लाइंट रन के बारे में शेफ रन के दो चरणों के बारे में अधिक जानने के लिए, अर्थात् संसाधन संग्रह की पीढ़ी और बाद के अभिसरण।

अब आपके इच्छित परिणाम के लिए, आप इस शर्त की जांच कर सकते हैं कि अभिसरण के दौरान स्रोत फ़ाइल मौजूद है और तदनुसार निर्णय लें।

आम तौर पर, शेफ में त्रुटियों को संभालना कठिन होता है।यह डिजाइन द्वारा है, जैसा कि आप आमतौर पर अपने सिस्टम को डिजाइन करना चाहिए कि यह अन्य भागों से स्वतंत्र है। इसलिए यदि आपको कोई निर्देशिका या फ़ाइल पेश करने की आवश्यकता है, तो आपको उचित संसाधन का उपयोग करके स्पष्ट रूप से बनाना चाहिए। तब आप उपयोग कर सकते हैं सूचनाएं एक निश्चित कार्रवाई चलाने के लिए अन्य संसाधनों को सूचित करने के लिए अगर वर्तमान संसाधन "बदल गया" (जो भी विशिष्ट संसाधन के लिए इसका मतलब है)।

नीचे दिया गया कोड कुछ इसी तरह हासिल करने की कोशिश करता हैक्या आप जाहिरा तौर पर चाहते हैं। यह अभी भी अभिसरण के दौरान एक अपवाद नहीं पकड़ता है, लेकिन पहली जगह में एक को उठाने की कोशिश नहीं करता है, लेकिन आवश्यक स्थितियों की जांच करता है और उपयुक्त संसाधनों को चलाता है।

node[:fileDeploy].each do |f|
if f[:deploy]
cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do
owner users["tomcatUser"]
group users["tomcatGroup"]
mode "0755"
cookbook node[:cookbookName]
source f[:sourceFilename]
only_if{ Dir.exist?(File.base_name(f[:sourceFilename]) }
notifies :run, "execute[success #{f[:sourceFilename]}]", :immediately
end

# This one gets notified (and run) when the cookbook_file is successful
execute "success #{f[:sourceFilename]}" do
action :nothing
command "do whatever you like"
end

# This one runs only if f[:sourceFilename] doesn"t exist by now
execute "error #{f[:sourceFilename]}" do
action :run
command "do whatever you like"
creates f[:sourceFilename]
end
end
end