2012-09-24 8 views
9

के लिए टेस्ट वहाँ परीक्षण करने के लिए कि किसी दिए गए cookbook_file एक महाराज नुस्खा में मौजूद कोई तरीका है? मैं निम्नलिखित की तरह कुछ करना चाहते हैं:बावर्ची - cookbook_file अस्तित्व

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
end 

और यह नहीं असफल हो, तो फ़ाइल "etc/cron.d/{SERVICE_NAME}" मौजूद नहीं है, के बाद से मैं कई सेवाओं एक मशीन पर चल रहा हो सकता है , लेकिन उनमें से कुछ ने क्रॉन नौकरियों को जोड़ा है।

मैं सेवाओं है कि जैसे

['service_1', 'service_2', ...], 

क्रॉन नौकरियों लेने के बाद से कि काफी भंगुर लगता है की एक बड़ी सूची है करने के लिए नहीं करना चाहती। आदर्श रूप से, मैं एक निर्देशिका चाहता हूं जिसमें उन सेवाओं के लिए क्रॉन नौकरियां हों, जिनकी आवश्यकता है, और यदि ये फ़ाइलें मौजूद नहीं हैं तो नुस्खा विफल नहीं है। क्या मैं संभव के लिए देख रहा हूँ?

उत्तर

6

जहाँ तक मुझे पता है, यह संभव नहीं लाभ में परीक्षण करने के लिए करता है, तो cookbook_file मौजूद है। लेकिन अगर आप फ़ाइल नहीं मिला तो आप असफल होने की बजाय शेफ को रन जारी रख सकते हैं।

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
    ignore_failure true 
end 
+0

यह मेरे लिए काफी अच्छा काम करता है - धन्यवाद! – Marc

+1

हालांकि यह लॉग में एक त्रुटि उत्पन्न करता है। – timurb

3

इस chef_gem आजमाएँ: http://www.rubydoc.info/github/3ofcoins/chef-helpers

फिर आप उपयोग कर सकते हैं has_sourceonly_if करने के लिए फ़ाइल नुस्खा में है उदाहरण के लिए:

only_if { has_source?("optional.config.file", :files) }

0

कुल मिलाकर, मैं करूंगा @JonathanM द्वारा प्रदत्त answer का उपयोग करने का सुझाव दें।

आप एक chef_gem पर कोड क्या आप नुस्खा में की जरूरत है निर्भर करने के लिए, यहाँ नहीं करना चाहते हैं। इस कोड का परीक्षण Chef 11.12.8 पर किया गया था, लेकिन मुझे लगता है कि इसे किसी भी Chef 11.x संस्करण के साथ काम करना चाहिए।

एक cookbook_file के स्रोत:

only_if { run_context.has_cookbook_file_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

एक template के लिए जाँच करने के लिए 'के लिए जाँच करने के लिए रों स्रोत:

only_if { run_context.has_template_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

चर cookbook_name किसी भी नुस्खा भीतर परोक्ष उपलब्ध है और वर्तमान रसोई की किताब है मूल्य के रूप में नाम। यह जांचने के लिए कि क्या किसी अन्य कुकबुक में टेम्पलेट या फ़ाइल है, cookbook_name को हार्ड-कोडेड स्ट्रिंग द्वारा प्रतिस्थापित करें उदाहरण के लिए "java"। के बाद से कोड प्रमुख रिहाई के बीच (यहां तक ​​कि मामूली विज्ञप्ति मुझे लगता है कि दोनों के बीच) को बदल सकता है

नोट बावर्ची आंतरिक एपीआई के साथ twiddling कि, जोखिम भरा है। यही कारण है कि chef_gem का भरोसा करना एक अच्छा विचार है, मणि शेफ के कई संस्करणों से निपट सकता है, यह नुस्खा कोड में दृश्य अव्यवस्था को कम करता है और डीएसएल अच्छी तरह से सोचा जाता है तो नुस्खा का कोड अधिक पठनीय भी बना सकता है।

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