2013-07-30 6 views
9

मैं कई दूरस्थ नोड्स पर एक साधारण नौकरी निष्पादित करने के लिए उत्तरदायी का उपयोग करना चाहता हूं। वास्तविक नौकरी में कुछ लॉग फाइलों को grepping और उसके स्थानीय होस्ट पर परिणामों को पोस्ट-प्रोसेस करना शामिल है (जिसमें रिमोट नोड्स पर सॉफ़्टवेयर उपलब्ध नहीं है)।मैं प्रोग्राम को व्यावहारिक रूप से और समवर्ती रूप से कैसे चला सकता हूं?

कमांड लाइन उत्तरदायी उपकरण इस उपयोग के मामले के लिए उपयुक्त नहीं लगते हैं क्योंकि वे दूरस्थ रूप से निष्पादित कमांड के आउटपुट के साथ उत्तर-जेनरेट किए गए स्वरूपण को एकसाथ मिलाते हैं। पाइथन एपीआई ऐसा लगता है कि यह इस में सक्षम होना चाहिए, क्योंकि यह आउटपुट को अनमोडिफाइड करता है (कुछ संभावित यूनिकोड मैंगलिंग के अलावा जो यहां प्रासंगिक नहीं होना चाहिए)।

अजगर कार्यक्रम का एक सरलीकृत संस्करण मैं इस तरह दिखता है के साथ आ गया है:

from sys import argv 
import ansible.runner 
runner = ansible.runner.Runner(
    pattern='*', forks=10, 
    module_name="command", 
    module_args=(
     """ 
     sleep 10 
     """), 
    inventory=ansible.inventory.Inventory(argv[1]), 
) 
results = runner.run() 

यहाँ, sleep 10 grepping आदेश वास्तविक लॉग के लिए में खड़ा - विचार सिर्फ एक आदेश है कि नहीं है अनुकरण करने के लिए है तुरंत पूरा करने जा रहा है।

हालांकि, इसे चलाने पर, मैं देखता हूं कि लिया गया समय मेरी सूची में मेजबानों की संख्या के समान होता है। यहाँ 2, 5, और 9 मेजबानों के साथ माल के खिलाफ समय परिणाम प्राधिकरण हैं:

[email protected]:/tmp$ time python howlong.py two-hosts.inventory 
real 0m24.285s 
user 0m0.216s 
sys  0m0.120s 
[email protected]:/tmp$ time python howlong.py five-hosts.inventory                     
real 0m55.120s 
user 0m0.224s 
sys  0m0.160s 
[email protected]:/tmp$ time python howlong.py nine-hosts.inventory 
real 1m57.272s 
user 0m0.360s 
sys  0m0.284s 
[email protected]:/tmp$ 

कुछ अन्य यादृच्छिक टिप्पणियों:

  • ansible all --forks=10 -i five-hosts.inventory -m command -a "sleep 10" दर्शाती समान व्यवहार
  • ansible all -c local --forks=10 -i five-hosts.inventory -m command -a "sleep 10" समवर्ती बातों पर अमल करने प्रतीत होता है (लेकिन केवल स्थानीय-केवल कनेक्शन के लिए ही काम करता है)
  • ansible all -c paramiko --forks=10 -i five-hosts.inventory -m command -a "sleep 10" चीजों को एक साथ निष्पादित करने के लिए प्रतीत होता है

शायद यह सुझाव देता है कि समस्या एसएसएच परिवहन के साथ है और इसमें कॉमंड लाइन के विपरीत पायथन एपीआई के माध्यम से उत्तरदायी का उपयोग करने के साथ कुछ लेना देना नहीं है।

यहां क्या गलत है जो डिफ़ॉल्ट सूची को मेरी सूची में मेजबानों की संख्या के बावजूद केवल दस सेकंड लेने से रोकती है?

उत्तर

5

कुछ जांच से पता चलता है कि जवाब मेरी सूची में मेजबानों को ~/.ssh/known_hosts में ढूंढ रहा है। मेरी कॉन्फ़िगरेशन हैशकनाउनहोस्ट सक्षम है। उत्तरदायी मेजबान प्रविष्टियों को कभी भी ढूंढने में सक्षम नहीं है क्योंकि यह हैश ज्ञात होस्ट एंट्री प्रारूप को समझ में नहीं आता है।

जब भी उत्तरदायी एसएसएच परिवहन ज्ञात मेजबान प्रविष्टि नहीं ढूंढ पाता है, तो यह मॉड्यूल के निष्पादन की अवधि के लिए वैश्विक लॉक प्राप्त करता है। इस संगम का परिणाम यह है कि सभी निष्पादन प्रभावी ढंग से क्रमबद्ध किया जाता है।

host_key_checking = False~/.ansible.cfg में डालकर कुछ सुरक्षा और अक्षम मेजबान कुंजी जांच को छोड़ना एक अस्थायी कार्य-आसपास है। एक अन्य कार्य-आसपास परमिको परिवहन का उपयोग करना है (लेकिन यह कुछ कारणों से एसएसएच परिवहन की तुलना में अविश्वसनीय रूप से धीमा, संभवतः दस गुना या सैकड़ों गुना धीमा है)। उत्तरदायी एसएसएच परिवहन के लिए ज्ञात_होस्ट्स फ़ाइल में कुछ अनछुए प्रविष्टियों को जोड़ने के लिए एक और काम-आसपास है।

3

चूंकि आपके पास हैशनाउनहोस्ट सक्षम हैं, इसलिए आपको Ansible के नवीनतम संस्करण में अपग्रेड करना चाहिए। संस्करण 1.3 ने known_hosts के लिए समर्थन जोड़ा, the bug tracker और changelog देखें।इससे सुरक्षा समझौता किए बिना आपकी समस्या हल होनी चाहिए (host_key_checking=False का उपयोग कर कार्यवाही) या बलिदान गति (paramiko का उपयोग कर अपना कामकाज)।

+1

यह समस्या का कारण जानने के बाद मेरी बग रिपोर्ट है। :) –

+0

ओह, मुझे नहीं पता था कि यह आपके द्वारा रिपोर्ट किया गया था (जीएच मुद्दा mpdehaan द्वारा खोला गया था और जिमी-सी द्वारा तय किया गया था)। देवताओं के ध्यान में लाने के लिए धन्यवाद! :) –

0
Ansible 2.0 अजगर एपीआई के साथ

, मैं

import ansible.constants 

ansible.constants.HOST_KEY_CHECKING = False 

साथ StrictHostKeyChecking बंद मैं कामयाब रहे कंप्यूटर पर निम्न सेटिंग के द्वारा काफी Ansible में तेजी लाने में कामयाब रहे। मुझे लगता है कि नए एसएसडीडी के पास दूसरी तरफ डिफ़ॉल्ट है, इसलिए आपके मामले में इसकी आवश्यकता नहीं हो सकती है।

/etc/ssh/sshd_config 
---- 
UseDNS no 
संबंधित मुद्दे