2012-01-19 12 views
9

के साथ "निष्पादित" करने के लिए नेस्टेड कॉल करना पाइथन का कपड़ा फ़ंक्शन का उपयोग करके fab उपयोगिता के बाहर कपड़े फ़ंक्शन को आमंत्रित करने की क्षमता प्रदान करता है। एक प्रासंगिक समस्या उत्पन्न होती है जब execute फ़ंक्शन किसी अन्य फ़ंक्शन के भीतर लागू किया जाता है जिसे निष्पादित करने के द्वारा बुलाया जाता था। फैब्रिक बाहरी निष्पादन के संदर्भ को खो देता है जब आंतरिक निष्पादन का आह्वान किया जाता है और इसे कभी भी ठीक नहीं करता है। उदाहरण के लिए:पाइथन की फैब्रिक लाइब्रेरी

env.roledefs = { 
    'webservers': ['web1','web2'], 
    'load_balancer': ['lb1'] 
} 

@roles('webserver') 
def deploy_code(): 
    #ship over tar.gz of code to unpack. 
    ... 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 
    ... 
    #shutdown webserver, unpack files, and restart web server 
    ... 
    execute(add_webserver_to_load_balancer, sHost=env.host_string) 

@roles('load_balancer') 
def remove_webserver_from_load_balancer(sHost=None): 
    ssh("remove_host %s" % sHost) 

execute(deploy_code) 

execute करने के लिए पहली कॉल के बाद, कपड़ा पूरी तरह से उसके संदर्भ खो देता है और host_string='lb1' बजाय 'web1' साथ deploy_code समारोह के भीतर सभी आगे आदेशों निष्पादित करता है। मैं इसे याद रखने के लिए कैसे प्राप्त कर सकता हूं?

मैं इस हैक के साथ आया था, लेकिन मुझे लगता है कि यह भविष्य के रिलीज पर टूट सकता:

with settings(**env): 
    execute(remove_webserver_from_load_balancer, sHost=env.host_string) 

यह प्रभावी रूप से सभी राज्य बचाता है और कॉल के बाद यह पुनर्स्थापित करता है, लेकिन के एक अनपेक्षित उपयोग की तरह लगता है समारोह। फैब्रिक को यह बताने का एक बेहतर तरीका है कि यह एक नेस्टेड निष्पादन में है और राज्य को याद रखने के लिए एक सेटिंग स्टैक या समकक्ष विधि का उपयोग करने के लिए है?

धन्यवाद!

+0

बीटीडब्ल्यू, मैं फैब्रिक 1.3.4 – adowds

+0

का उपयोग कर रहा हूं आप फ़ंक्शन को सीधे कॉल करने के बजाय 'execute() 'कार्यों के अंदर क्यों उपयोग करते हैं? – jfs

+1

@ जेएफएसबीस्टियन मुझे लगता है कि [दस्तावेज़ीकरण] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) आपके प्रश्न का उत्तर देता है: 'फैब्रिक का डिज़ाइन जादुई व्यवहार को छोड़ देता है, इसलिए बस कॉल करना कार्य फ़ंक्शन खाता सजावटकर्ताओं जैसे भूमिकाओं में नहीं लेता है। – jcollado

उत्तर

1

आप कपड़े का सही उपयोग नहीं कर रहे हैं। जैसा कि आप केवल python की तरह fabfile चलाने के बजाय fab deploy_code पर कॉल करेंगे। मैं सुझाव देता हूं कि अपने fabfile को कैसे व्यवस्थित करें इस पर एक बेहतर विचार के लिए ट्यूटोरियल के माध्यम से जाना।

किसी भी तरह से, आप execute(), और here का उपयोग करने के लिए look here निर्दिष्ट कर सकते हैं।

आपके पास एक टाइपो है जिसमें आपने वेबसर्वर भूमिका से 's' को छोड़ दिया है। जब आप दूसरे कार्य पर चाहते हैं तो आपके पास एक अच्छा मेजबान स्ट्रिंग नहीं हो सकती है।

लेकिन एक तरफ, आप execute() कमांड में भूमिकाएं और मेजबान भी सेट कर सकते हैं।

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