कई वजहें हैं, जो वास्तव में एकत्रित होने पर लटकी हो सकती हैं, लेकिन आगे बढ़ने से पहले, यहां पर आपको ऐसी किसी भी स्थिति में पहली परीक्षा देनी चाहिए:
ansible -m ping <hostname>
यह परीक्षण केवल होस्ट से जुड़ता है, और लौटने के लिए पर्याप्त कोड निष्पादित करता है:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
यदि यह काम करता है, तो आप किसी भी सेटअप या कनेक्टिविटी समस्या का बहुत अधिक नियंत्रण कर सकते हैं, क्योंकि यह साबित करता है कि आप लक्ष्यनाम को हल कर सकते हैं, कनेक्शन खोल सकते हैं, प्रमाणित कर सकते हैं, और दूरस्थ पायथन दुभाषिया के साथ एक अनसुने मॉड्यूल को निष्पादित कर सकते हैं।
अब, यहां उन चीजों की सूची दी गई है, जो प्लेबुक की शुरुआत में गलत हो सकती हैं:
Ansible द्वारा निष्पादित कमांड एक संवादात्मक इनपुट की प्रतीक्षा कर रहा है
मुझे याद है कि यह पुराने पुराने संस्करणों पर हो रहा है, जहां एक कमांड एक इंटरएक्टिव इनपुट की प्रतीक्षा करेगा जो कभी नहीं आएगा, जैसे कि एक सूडो पासवर्ड (जब आप एक -K
स्विच भूल गए थे ), या एक नए ssh होस्ट फिंगरप्रिंट (नए लक्ष्य के लिए) की स्वीकृति मेज़बान)।
इन संस्करणों के आधुनिक संस्करण इन दोनों मामलों को इनायत से संभालते हैं और सामान्य usecases के लिए तुरंत एक त्रुटि उठाते हैं, इसलिए जब तक आप खुद को ssh या sudo जैसी चीजें नहीं कर रहे हैं, तब तक आपके पास इस तरह का मुद्दा नहीं होना चाहिए। और अगर आपने किया भी, तो यह तथ्य एकत्र करने के बाद होगा।
मृत ssh मास्टर कनेक्शन
यहाँ दिए गए डीबग लॉग में ssh क्लाइंट के लिए कुछ बहुत ही दिलचस्प विकल्प दिए गए हैं:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
ये विकल्प आदमी ssh_config में प्रलेखित हैं ।
डिफ़ॉल्ट रूप से, ansible अपने ssh कनेक्शन के उपयोग के बारे में कोशिश करेगा और स्मार्ट होगा। किसी दिए गए होस्ट के लिए, नाटक में प्रत्येक कार्य के लिए एक नया कनेक्शन बनाने के बजाय, यह एक बार इसे खोलेगा, और इसे पूरी प्लेबुक (और यहां तक कि प्लेबुक के लिए भी) खुला रखेगा।
यह अच्छा है, क्योंकि एक नया कनेक्शन स्थापित करना पहले से मौजूद एक का उपयोग करने की तुलना में कहीं अधिक धीमा और संगणनीय है।
व्यवहार में, प्रत्येक ssh कनेक्शन एक सॉकेट के अस्तित्व के लिए जाँच करेगा ~/.ansible/cp/some-host-specific-path
। पहला कनेक्शन इसे नहीं मिल सकता है, इसलिए यह सामान्य रूप से जोड़ता है, और फिर इसे बनाता है। प्रत्येक बाद का कनेक्शन तब पहले से स्थापित कनेक्शन के माध्यम से जाने के लिए बस इस सॉकेट का उपयोग करेगा।
यहां तक कि अगर स्थापित कनेक्शन अंत में बार-बार बाहर निकलता है और लंबे समय तक उपयोग नहीं किए जाने के बाद बंद हो जाता है, तो सॉकेट भी बंद हो जाता है, और हम एक वर्ग में वापस आ जाते हैं।
अब तक सब ठीक है।
हालांकि कभी-कभी, कनेक्शन वास्तव में मर जाता है, लेकिन ssh क्लाइंट अभी भी इसे स्थापित मानता है। यह आमतौर पर तब होता है जब आप लैपटॉप से प्लेबुक निष्पादित करते हैं, और आप अपना वाईफाई कनेक्शन खो देते हैं (या वाईफाई से ईथरनेट, आदि) पर स्विच करते हैं।
यह अंतिम उदाहरण एक भयानक स्थिति है: आप डिफ़ॉल्ट ssh config के साथ लक्ष्य मशीन के लिए ssh कर सकते हैं , लेकिन जब तक आपका पिछला कनेक्शन अभी भी सक्रिय माना जाता है, तब तक ansible एक नया स्थापित करने का प्रयास नहीं करेगा।
इस बिंदु पर, हम केवल इस पुराने सॉकेट से छुटकारा पाना चाहते हैं, और इसे हटाने का सबसे सरल तरीका है:
# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>
यह एक-शॉट फिक्स के लिए एकदम सही है, लेकिन अगर यह बहुत बार होता है, तो आपको एक दीर्घकालिक फिक्स की तलाश करनी पड़ सकती है। यहाँ कुछ संकेत दिए गए हैं जो इस लक्ष्य की मदद कर सकते हैं:
- सर्वर से प्लेबुक शुरू करें (आपके लैपटॉप की तुलना में अधिक स्थिर नेटवर्क कनेक्शन के साथ)
- कनेक्शन साझाकरण को अक्षम करने के लिए ansible कॉन्फ़िगरेशन या सीधे ssh क्लाइंट कॉन्फ़िगरेशन का उपयोग करें
- समान संसाधनों का उपयोग करें, लेकिन टाइम-ट्यून को ठीक करने के लिए, ताकि मास्टर कनेक्शन क्रैश वास्तव में तेजी से बाहर हो
कृपया ध्यान दें कि लेखन के समय, कुछ विकल्प बदल गए हैं (उदाहरण के लिए, मेरे नवीनतम रन ने मुझे ControlPath=/home/toadjaune/.ansible/cp/871b533295
), लेकिन सामान्य विचार अभी भी मान्य है।
तथ्य जुटाने में वास्तव में बहुत अधिक समय लग रहा है
हर नाटक की शुरुआत में, लक्ष्य प्रणाली पर बहुत सारी जानकारी एकत्र करता है, और इसे तथ्यों में डालता है । ये चर हैं जिन्हें आप अपनी प्लेबुक में उपयोग कर सकते हैं, और आमतौर पर वास्तव में काम करते हैं, लेकिन कभी-कभी, यह जानकारी प्राप्त करना बहुत लंबा हो सकता है (खराब माउंट बिंदु, उच्च i / o, उच्च भार के साथ डिस्क ...)
यह कहा जा रहा है, आपको प्लेबुक चलाने के लिए कड़ाई से तथ्यों की आवश्यकता नहीं है , और लगभग निश्चित रूप से उन सभी को नहीं, तो चलिए कोशिश करते हैं और अक्षम करते हैं जो हमें ज़रूरत नहीं है। उसके लिए कई विकल्प:
- पूरी तरह से सेटअप मॉड्यूल को अक्षम करें
- सेटअप मॉड्यूल के कॉन्फ़िगरेशन को बदलें केवल इसके कुछ भागों को शामिल करने के लिए।
डिबगिंग उद्देश्यों के लिए, कमांड-लाइन से सीधे सेटअप मॉड्यूल को लागू करना वास्तव में सुविधाजनक है:
ansible -m setup <hostname>
यह अंतिम कमांड आपकी प्लेबुक के साथ ही लटकनी चाहिए, और अंततः टाइमआउट (या सफल) होनी चाहिए। अब, मॉड्यूल को फिर से निष्पादित करें, जो हम कर सकते हैं सब कुछ अक्षम करें:
ansible -m setup -a gather_subset='!all' <hostname>
यदि यह अभी भी लटका हुआ है, तो आप हमेशा कोशिश कर सकते हैं और अपने खेलने में पूरी तरह से मॉड्यूल को अक्षम कर सकते हैं, लेकिन यह वास्तव में संभावना है कि आपकी समस्या कहीं और है।
यदि, हालांकि, यह ठीक (और जल्दी से) काम करता है, तो मॉड्यूल प्रलेखन पर एक नज़र डालें । आपके पास दो विकल्प हैं:
- तथ्य को एक उपसमुच्चय तक सीमित करें, इसके अलावा आपको क्या ज़रूरत नहीं है (इसके लिए संभावित मान देखें
gather_subset
)
gather_timeout
अधिक समय की अनुमति देकर भी आप अपने मुद्दे को ठीक करने में मदद कर सकते हैं (हालांकि यह टाइमआउट त्रुटि को ठीक करने के लिए होगा, हैंग नहीं होगा)
अन्य मामले
जाहिर है, अन्य चीजें गलत हो सकती हैं। डीबगिंग में मदद करने के लिए कुछ संकेत:
- प्रयोग योग्य अधिकतम वर्बोसिटी स्तर (
-vvvv
) का उपयोग करें , क्योंकि यह आपको निष्पादित प्रत्येक कमांड को दिखाएगा
- ऊपर बताए अनुसार कमांड-लाइन से सीधे उपयोग
ping
और setup
मॉड्यूल
- अगर
ansible -m ping
काम नहीं करता है तो मैन्युअल रूप से ssh करने का प्रयास करें
vagrant ssh
यह देखने के लिए कि क्या कुछ उपयोगी हैps
और देखने के लिए हैंग होने के दौरान कोशिश की थीnetstat
? इसके अलावा, हैंग में पहले संदिग्धों में से एक डीएनएस है - यह चेक करें कि क्या डीएनएस वर्चुअल मशीन के अंदर से हल हो रहा है।