2013-01-12 21 views
50

कुछ स्थितियों के तहत, मुझे एक गैर-शून्य स्थिति कोड के साथ एक शेफ चलाने को समाप्त/समाप्त करने की आवश्यकता है, जो तब हमारी तैनाती श्रृंखला के माध्यम से और अंततः जेनकींस के माध्यम से एक बड़ी, वसा लाल गेंद के परिणामस्वरूप प्रचारित करेगा।आप शेफ रन को कैसे समाप्त/समाप्त करते हैं?

ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

104

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

एरिक होलेन्सबे ने उत्कृष्टhow this works in 2013 के माध्यम से चलना लिखा।

अब, उत्तर के लिए:

ऐसे कई तरीके हैं एक बावर्ची रन अंत, या एक बावर्ची नुस्खा बाहर निकलते हैं, आप कैसे इसके बारे में जाने के लिए, के बाद से बावर्ची व्यंजनों रूबी कोड हैं चाहते हैं पर निर्भर करता है के लिए कर रहे हैं।

यदि आपका लक्ष्य किसी शर्त के आधार पर नुस्खा को प्रसंस्करण करना बंद करना है, लेकिन शेष रन के साथ जारी रखें, तो return रूबी कीवर्ड का उपयोग करें। उदाहरण के लिए:

file '/tmp/ponies' do 
    action :create 
end 

return if node['platform'] == 'windows' 

package 'bunnies-and-flowers' do 
    action :install 
end 

हम अनुमान है कि अगर सिस्टम विंडोज है, यह एक पैकेज प्रबंधक कि खरगोशों और फूल पैकेज स्थापित कर सकते हैं नहीं है, तो हम वापस लौटें।

आप बावर्ची निरस्त करने के लिए चाहते हैं, तो पूरी तरह से चलाने के

जानने के कुछ अन्य बातों के आप कर सकते हैं। महाराज बाहर निकलता है अगर यह शेफ रन में कहीं भी एक अनचाहे अपवाद का सामना करता है। उदाहरण के लिए, यदि कोई टेम्पलेट संसाधन अपनी स्रोत फ़ाइल नहीं ढूंढ सकता है, या यदि शेफ चलाने वाले उपयोगकर्ता को निर्देशिका बनाने जैसी कुछ करने की अनुमति नहीं है। यही कारण है कि raise का उपयोग एक रन समाप्त करने के लिए काम करता है।

जहां आप raise मामले डालते हैं। यदि आप इसे ruby_block संसाधन में उपयोग करते हैं, तो यह केवल अभिसरण चरण में अभिसरण चरण के दौरान उठाएगा। यदि आप उपरोक्त उदाहरण return उदाहरण के संसाधन के बाहर इसका उपयोग करते हैं, तो यह संकलन चरण के दौरान होगा।

file '/tmp/ponies' do 
    action :create 
end 

raise if node['platform'] == 'windows' 

package 'bunnies-and-flowers' do 
    action :install 
end 

शायद हमारे पास विंडोज़ पर एक पैकेज मैनेजर है, और हम यह पैकेज स्थापित करना चाहते हैं। बढ़ोतरी के परिणामस्वरूप शेफ मोटे तौर पर बाहर निकलता है और एक स्टैक ट्रेस दे रहा है।

एक और तरीका Chef::Application.fatal! का उपयोग करना है। यह शेफ लॉगर और एसटीडीईआरआर को fatal संदेश लॉग करता है, और एप्लिकेशन से बाहर निकलता है। आप इसे एक रिटर्न कोड भी दे सकते हैं (शायद आपके पास एक स्क्रिप्ट है जो उनको जांचती है?)।

Chef::Application.fatal!("Didn't expect the Spanish Inquistion", 42) if spanish_inquisition 

(निश्चित रूप से spanish_inquisition आमतौर पर शून्य के बाद से कोई भी इसे उम्मीद है ... मैं पीछे हटना है ...)

इसके परिणामस्वरूप शेफ बाहर निकलने, लॉग संदेश भेजा गया, और प्रक्रिया से वापसी कोड 42 होगा।

नोट: यह, बाहर निकलने के लिए पूरा आवेदन का कारण बनता है, जिसका अर्थ है कि यह एक daemonized सेवा के रूप में चल रहा है, यह समाप्त होगा, और कैसे सेवा प्रबंधित किया जाता है पर निर्भर करता है, यह या फिर से शुरू नहीं हो सकता है। उदाहरण के लिए, init.d सेवा पुनरारंभ नहीं होगी, लेकिन runit सेवा होगी।

व्यंजनों रूबी हैं, इसलिए आप begin..rescue ब्लॉक के साथ त्रुटि स्थितियों को भी गहन रूप से संभाल सकते हैं।

begin 
    dater = data_bag_item(:basket, "flowers") 
rescue Net::HTTPServerException 
    # maybe some retry code here? 
    raise "Couldn't find flowers in the basket, need those to continue!" 
end 

data_bag_item बावर्ची सर्वर पर एक डेटा बैग के लिए एक HTTP अनुरोध बनाता है, और वहाँ सर्वर से कोई समस्या होने पर एक Net::HTTPServerException वापस आ जाएगी (404 नहीं मिला, 403 अनधिकृत, आदि)। हम संभवतः पुनः प्रयास करने या कुछ अन्य हैंडलिंग करने का प्रयास कर सकते हैं, और फिर raise पर वापस आ सकते हैं।

रिपोर्टिंग त्रुटियाँ

सीधे शब्दों में बाहर निकलने और एक स्टैक ट्रेस घालना ठीक आप कमांड लाइन से बावर्ची चला रहे हैं है। हालांकि, अगर आप क्रॉन में या कुछ, या यहां तक ​​कि दर्जनों या सैकड़ों मशीनों में डेमॉन के रूप में इसे चला रहे हैं, तो समस्या होने पर स्वच्छता रखने का यह एक अच्छा तरीका नहीं है।

Chef's report/exception handler feature दर्ज करें। आप अपने शेफ रन के लिए हैंडलर का उपयोग कर सकते हैं। शेफ रन के अंत में सभी रिपोर्ट हैंडलर चलाए जाते हैं। अपर्याप्त शेफ रन के अंत में अपवाद हैंडलर चलाए जाते हैं। रन की स्थिति को ट्रैक किया जाता है, और हैंडलर में चेक किया जा सकता है, ताकि आप एक ऐसे व्यक्ति को लिख सकें जो दोनों प्रकार के रन (सफल/पूर्ण या असफल/निरस्त) को संभालता है।

documentation आपको बताता है कि एक कैसे लिखना है। यह भी है कि आप सेवाओं की एक किस्म के लिए उपयोग कर सकते हैं, सहित उपलब्ध open source handlers की एक सूची में शामिल हैं:

  • एसएमटीपी
  • आईआरसी
  • ग्रेफाइट
  • HipChat से अधिक ईमेल

और कई और अधिक ।

+2

बहुत बढ़िया जवाब! बहुत उपयोगी। मैंने इसे विभिन्न शेफ संसाधनों में देखा था, लेकिन इसे नहीं मिला। अगर मेरे पास था, तो यह प्रश्न मौजूद नहीं होगा।हाल ही में, मैंने फैसला किया कि जब मैंने किसी प्रश्न के उत्तर की खोज की और उसे या तो स्टैक ओवरफ्लो या अपेक्षाकृत संसाधनों से आसानी से नहीं मिला, तो एक बार जब मैंने जवाब दिया तो मैं एक स्टैक ओवरफ्लो प्रश्न और उत्तर जोड़ी जो मैंने सीखा । –

+1

मैं कभी भी काम करने के लिए 'बचाव नेट :: HTTPServerException' प्राप्त करने में सक्षम नहीं हूं। यह अपवाद को बचाता नहीं है। – Zabba

+0

स्पेनिश पूछताछ टिप्पणी से प्यार था :-) – Mamun

7

शेफ रन को निरस्त करने या संपादित करने का अनुशंसित तरीका अपवाद उठाना है। यहाँ एक उदाहरण है:

ruby_block "some tricky operation" do 
    block do 
    OperationFoo 
    raise "Operation Foo Failed" if some_condition 
    end 
end 
4

शेफ :: आवेदन.फताल! जो करना चाहते हैं उसे करना चाहिए। यहां हमारे कोड बेस से एक उदाहरण दिया गया है जो सहायक हो सकता है।

cipher = case key.length 
    when 16 then "AES-128-ECB" 
    when 24 then "AES-192-ECB" 
    when 32 then "AES-256-ECB" 
else 
    Chef::Application.fatal!("AES Key must be 16, 24, or 32 characters in length but key #{key} has length of #{key.length}") 
end 
-3

एक बावर्ची-एकल चलाने के दौरान एक अशुद्ध बाहर निकलें करने के लिए, इस प्रयास करें:

bash 'exit' do 
    code 'killall -9 chef-solo' 
end 
-1

बस बयान नीचे का उपयोग करके ऐसी chef चाहते कुछ कार्रवाई के बाद समाप्त करने के लिए:

throw :end_client_run_early 

यह बिना किसी त्रुटि के बाहर निकल जाएगा।